实验3非线性方程求根问题

实验3非线性方程求根问题
实验3非线性方程求根问题

西华数学与计算机学院上机实践报告

课程名称:计算方法C年级:2011级上机实践成绩:

指导教师:严常龙姓名:

上机实践名称:非线性方程求根问题学号:上机实践日期:2012.12.10

上机实践编号:3上机实践时间:

一、目的

1.通过本实验的编程练习,加深对非线性方程求根方法之二分法、简单迭代法、、牛顿迭代法等的构造过程的理解;

2.能将各种方法的算法描述正确地改编为程序并上机实现;

3.比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。

二、内容与设计思想

自选求根问题,分别用二分法、简单迭代法、埃特金加速收敛法和牛顿迭代法求解其根,然后完成编程作业(注意把同一求根问题的几种不同方法放在一个程序之内)。以下求根问题供参考和选择,也可自行选择其他求根问题:

自拟题目:用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]内的根。方程f(x)=2x3-5x2-19x+42=0在x=3.0附近有根,用牛顿迭代法求其根。用简单迭代法求方程f(x)=x3+2x2+10x-20=0在区间[1 ,

1.5]上的根。

三、使用环境

操作系统:Windows 7

软件环境:VC++ 6.0

四、核心代码及调试过程

#include

#include

#define N 50

#define EPS 0.000000001

double f(double x)

{

return(x*x*x-2*x-5);//f(x)=x3-2x-5

}

double f2(double x)

{

return(2*x*x*x-5*x*x-19*x+42);//f(x)=2x3-5x2-19x+42

}

double f3(double x)

{

return(6*x*x-10*x-19);

}

double f4(double x)

{

return(x*x*x+2*x*x+10*x-20);//f(x)=x3+2x2+10x-20 }

void erfen(double a,double b) //二分法

{

int k=0;

double c,fa,fb,fc;

fa=f(a);

fb=f(b);

if((fa*fb)<0)

{

for(k=1;k

{

c=(a+b)/2;

fc=f(c);

if((fa*fc)>0)

{

a=c;fa=fc;

cout<<"迭代第"<

}

else

{ b=c;fb=fc;

cout<<"迭代第"<

}

if(fabs(b-a)

}

if(k>=N)

cout<<"\n迭代次数已达上界,迭代不收敛。";

}

else

cout<<"不能使用二分法求解。\n";

}

void Newton(double a,double b,double x0)//牛顿法

{

int k;

double x;

for(k=1;k

{

x=x0-f2(x0)/f3(x0);

if(xb)

{

cout<<"请另选初值!"<

break;

}

if(fabs(x-x0)

cout<<"迭代第"<

x0=x;

}

if(k>=N)

cout<<"\n迭代次数已达上界,迭代不收敛。\n";

}

void iterate(double a,double b,double x0)//简单迭代

{

int k;

double x;

for(k=1;k

{

x=f4(x0);

if((xb))

{

cout<<"请另选初值!"<

break;

}

if(fabs(x-x0)

cout<<"迭代第"<

x0=x;

}

if(k>=N)

cout<<"\n迭代次数已达上界,迭代不收敛。\n";

}

void main()

{

cout<<"二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]内的根为:"<

erfen(2,3);

cout<<"方程f(x)=2x3-5x2-19x+42=0在x=3.0附近有根,用牛顿迭代法求其值为:"<

Newton(2,4,3);

cout<<"简单迭代法求方程f(x)=x3+2x2+10x-20=0在区间[1 , 1.5]上的根为:"<

iterate(1,1.5,1);

}

五、总结

基本掌握非线性方程求根问题,但在熟练程度上还不够。在今后学习中还得努力。

六、附录

见*.cpp

陕西科技大学matlab实验1 解非线性方程实验

实验1 解非线性方程实验 成绩 实验类型:●验证性实验 ○综合性实验 ○设计性实验 实验目的:进一步熟练掌握解非线性方程二分法算 法、弦截法算法,提高编程能力和解算非线性方程问题的 实践技能。 实验内容:用二分法算法、牛顿迭代法,弦截法算法解算非线性方程,,计算=0的根 实验原理二分法算法 牛顿迭代法 弦截法算法 实验步骤 1 要求上机实验前先编写出程序代码 2 编辑录入程序 3 调试程序并记录调试过程中出现的问题及修改 程序的过程 4 经反复调试后,运行程序并验证程序运行是否 正确。 5 记录运行时的输入和输出。 实验总结 实验报告:根据实验情况和结果撰写并递交实验报告。 参考程序 一.二分法算法 1.建立二分法的函数文件bisect.m function [c,err,yc]=bisect(f,a,b,delta) %Iput - f is the function input as a string 'f'

% -a and b are the left and right end points % -delta is the tolerance %Output -c is the zero point % -yc=f(c) % -err is the error estimate for c ya=feval(f,a); yb=feval(f,b); if ya*yb > 0,return,end max1=1+round((log(b-a)-log(delta))/log(2)); for k=1:max1 c=(a+b)/2; yc=feval(f,c); if yc==0 a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if b-a < delta,break,end end c=(a+b)/2; err=abs(b-a); yc=feval(f,c); 2.建立f(x)=x^2-5的matlab函数文件fff.m function y=fff(x); y=x.^2-5; 3.在命令窗口中准备调用bisect函数的实参 >> a=2; >> b=3; >> delta=0.0001; 4.在命令窗口中调用bisect函数 >> [x,err,yx]=bisect('fff',a,b,delta) x =

推荐-Broyden方法求解非线性方程组的Matlab实现 精品

Broyden方法求解非线性方程组的Matlab实现 注:matlab代码来自网络,仅供学习参考。 1.把以下代码复制在一个.m文件上 function [sol, it_hist, ierr] = brsola(x,f,tol, parms) % Broyden's Method solver, globally convergent % solver for f(x) = 0, Armijo rule, one vector storage % % This code es with no guarantee or warranty of any kind. % % function [sol, it_hist, ierr] = brsola(x,f,tol,parms) % % inputs: % initial iterate = x % function = f % tol = [atol, rtol] relative/absolute % error tolerances for the nonlinear iteration % parms = [maxit, maxdim] % maxit = maxmium number of nonlinear iterations % default = 40 % maxdim = maximum number of Broyden iterations % before restart, so maxdim-1 vectors are % stored % default = 40 % % output: % sol = solution % it_hist(maxit,3) = scaled l2 norms of nonlinear residuals % for the iteration, number function evaluations, % and number of steplength reductions % ierr = 0 upon successful termination % ierr = 1 if after maxit iterations % the termination criterion is not satsified. % ierr = 2 failure in the line search. The iteration % is terminated if too many steplength reductions % are taken. % % % internal parameter: % debug = turns on/off iteration statistics display as % the iteration progresses

matlab实验一:非线性方程求解-牛顿法

实验一:非线性方程求解 程序1:二分法: syms f x; f=input('请输入f(x)='); A=input('请输入根的估计范围[a,b]='); e=input('请输入根的误差限e='); while (A(2)-A(1))>e c=(A(1)+A(2))/2; x=A(1); f1=eval(f); x=c; f2=eval(f); if (f1*f2)>0 A(1)=c; else A(2)=c; end end c=(A(1)+A(2))/2; fprintf('c=%.6f\na=%.6f\nb=%.6f\n',c,A) 用二分法计算方程: 1.请输入f(x)=sin(x)-x^2/2 请输入根的估计范围[a,b]=[1,2] 请输入根的误差限e=0.5e-005 c=1.404413 a=1.404411 b=1.404415 2.请输入f(x)=x^3-x-1 请输入根的估计范围[a,b]=[1,1.5] 请输入根的误差限e=0.5e-005 c=1.324717 a=1.324715 b=1.324718 程序2:newton法: syms f x; f=input('请输入f(x)='); df=diff(f); x0=input('请输入迭代初值x0='); e1=input('请输入奇异判断e1='); e2=input('请输入根的误差限e2='); N=input('请输入迭代次数限N='); k=1; while (k=N fprintf('失败\n') end 用newton法计算方程: 1.请输入f(x)=x*exp(x)-1 请输入迭代初值x0=0.5 请输入奇异判断e1=0.1e-010 请输入根的误差限e2=0.5e-005 请输入迭代次数限N=10 x=0.567143 迭代次数为:4 2.请输入f(x)=x^3-x-1 请输入迭代初值x0=1 请输入奇异判断e1=0.1e-010 请输入根的误差限e2=0.5e-005

非线性方程求根word版

第7章 非线性方程求根 本章主要内容: 1.区间二分法. 2切线法. 3.弦位法. 4.一般迭代法. 重点、难点 一、区间二分法 区间二分法是求方程f(x)=0根的近似值的常用方法。 基本思想:利用有根区间的判别方法确定方程根的区间[a,b] ,将有根区间平分为二;再利用有根区间的判别方法判断那一个区间是有根区间;重复上述步骤,直到小区间端点差的绝对值小于等于精度要求的数值,则用将上一区间的分半值作为方程的根的近似值。 区间二分法的计算步骤如下: 1. 计算区间端点的函数值f(a) , f(b)(不妨设f(a)<0,f(b)>0); 确定初始有根区间[a,b]. 2.二分有根区间[a,b],并计算)2( b a f + 取2 1b a x += 3.判断: 若0)(1=x f ,则方程的根为1x x =* ; 若 0)(1>x f ,则有根区间为[]1,x a x ∈* ;令[]],[,111b a x a = 若 0)(1

12 ln ln )ln(---≥ ε a b n 确定应二分的次数。 例1 用区间二分法求方程0353 =+-x x 在某区间内实根的近似值(精确到0.001) 【思路】参见上述区间二分法的计算步骤 解 ∵f(1.8)=-0.168<0, f(1.9)=0.359>0 ∴f(x)在区间[1.8 ,1.9]内有一个根。 由公式 644.512 ln 001 .0ln 1.0ln 12ln ln )ln(=--=---≥ εa b n 取n=6, 计算结果列表如下: 则方程在区间[1.8,1.9]内所求近似值为x * ≈ x = 1.8328125 区间二分法的优点是计算程序简单,只要f (x )在区间[a,b]上连续,区间二分法就可使用,但区间二分法不能用来求偶次重根,由于区间二分法收敛比较慢,在实际计算中,区间二分法常用来求比较好的含根区间和初始近似值,以便进一步使用收敛更快的迭代法求出更精确的近似值。 迭代序列收敛阶的概念

用割线法解非线性方程组

用割线法解非线性方程组 自动化学院1011203050 陈晓祺拟牛顿法解下列方程组 sin 1.0 cos 5.00 ) cos( 1.0 sin 5.0 2 2 11 2 1 1 = - -= -+ x x x x x x x 先将拟牛顿法的程序代码如下 Function[r,m]=mulVlineF,x0,A, eps) Format long; If nargin=3 Eps=1e-4; End X0=transpose(x0); X1=tanspose(x1); N=length(x0); Fx=subs(F,findsym(F),x0); Fx1=subs(F,findsym(F),x1); H=x0-x1; J=zeros(n,n); Xt=x1; Xt(1)=x0(1); J(:,1)=(subs(F,findsym(F),xt)-sbus(F,findsym(F),x1))/h(1); For i=2:n Xt=x1; Xt(1:i)=x0(1:i); Xt_m=xl; Xt_m(1:i-1)=x0(1:i-1); J(:,i)=(subs(F,findsym(F),xt)-sbus(F,findsym(F),xt_m))/h(1); End R=x1-inv(J)*fx1; M=1; Tol=1; While tol>eps X0=x1; X1=r; Fx=subs(F,findsym(F),x0); Fx1=subs(F,findsym(F),x1); H=x0-x1;

J=zeros(n,n); Xt=x1; Xt(1)=x0(1); J(:,1)=(subs(F,findsym(F),xt)-subs(F,findsym(F),x1))/h(1); For i=2:n Xt=x1; Xt(1:i)=x0(1:i); Xt_m=x1; Xt_m(1:i-1)x0(1:i-1); J(:,1)=(subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(1); End R=x1-inv(J)*fx1; Tol=norm(r-x1); M=m+1; If(m>100000) Disp('fail'); Return; End End 然后直接调用该方法 Syms x y Z=[x^2+y^2-5;2*x-y-3]; [r,m]=mulline(z,[0 1],[4,3]) [r,m]=mulline(z,[-3 1],[4,3]) 得到解为(2,1)(0.4,-2.2)

实验报告二 一元非线性方程的解法..

浙江大学城市学院实验报告 课程名称 科学计算 实验项目名称 一元非线性方程的解法 实验成绩 指导老师(签名 ) 日期 2013/10/10 一. 实验目的和要求 1. 用Matlab 软件掌握求解非线性方程的二分法、迭代法和牛顿法,并对结果作初步分析; 2. 通过实例练习用非线性方程求解实际问题。 二. 实验内容和原理 分析应用题2-1,2-2,2-3,2-4,2-5要求将问题的分析过程、Matlab 源程序和运行结果和结果的解释、算法的分析写在实验报告上。 2-1 程序注释 对用二分法、迭代法和牛顿法求一元非线性方程数值解的Matlab 程序的每一句添上注释。 二分法: [x,n]=BisectionMethod(a,b,epsi,Nmax) 迭代法: [x,n]=IterationMethod(x0,epsi,Nmax) Newton 法: [x,n]=NewtonMethod(x0,epsi,Nmax) 2-2 分析应用题 用二分法求方程2 ()sin 04 x f x x =-=和()sin 0x g x e x =-=根的近似值,使误差不超过210-,输出每次二分之后解的近似结果以及二分的次数,其中()0g x =的根只需求最接近 原点的那个根。 2-3 分析应用题 已知方程230x x e -=有以下三种迭代格式,分析三种迭代格式的收敛性,求出迭代精度为610-的数值结果,并比较迭代序列的收敛速度。

1 )1n x += 2)12ln ln3n n x x +=+ 3)136n n x n n n x n x e x x x e +-=-- 2-4 分析应用题 用下列方法求方程1020x e x +-=的近似根,要求误差不超过31102-?,并比较计算量。 1)在区间[0, 1]上用二分法; 2)取初值0x =,并用迭代过程 12(0,1,2,.......) 10 k x k e x k +-==; 3)取初值00x =用牛顿法求解。 2-5 分析应用题 以定期存储为基础的储蓄帐户的累积值可由定期年金方程确定 [(1)1]n P A i i =+- 在这个方程中,A 是帐户中的数额,P 是定期存储的数额,i 是n 个存储期间的每期利率。一个工程师想在20年后退休时储蓄帐户上的数额达到750000美元,而为了达到这个目标,他每个月能存1500美元。为实现他的储值目标,最小利率应是多少?假定利息是月复利的。 三. 操作方法与实验步骤(包括实验数据记录和处理) 2-1 分析应用题 对用二分法、迭代法和牛顿法求一元非线性方程数值解的Matlab 程序的每一句添上注释。 二分法: [x,n]=BisectionMethod(a,b,epsi,Nmax) Function[c,err,yc]=erfen(f,a,b,delta) Ya=feval(f,a); Yb=feval(f,b); If ya*yb>0,break,end Maxl=1+round((log(b-a)-log(delta))/log(2)); For k=1:max1 C=(a+b)/2; Yc=feval(f,c); If yc = 0 a=c; b=c;

Maab求解线性方程组非线性方程组

M a a b求解线性方程组非 线性方程组 The latest revision on November 22, 2020

求解线性方程组solve,linsolve例:A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1];%矩阵的行之间用分号隔开,元素之间用逗号或空格B=[3;1;1;0]X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B)diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式diff(F); %matlab区分大小写pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 其中fun为待解方程或方程组的文件名; x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件: function y=fun(x) y=[x(1)*sin(x(1))*cos(x(2)), ... x(2) - *cos(x(1))+*sin(x(2))]; >>clear;x0=[,];fsolve(@fun,x0,optimset('fsolve'))注:...为续行符m文件必须以function 为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。 Matlab求解线性方程组AX=B或XA=B在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如:X=A\B表示求矩阵方程AX=B的解;X=B/A表示矩阵方程XA=B 的解。对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A 的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有:m=n 恰定方程,求解精确解;m>n 超定方程,寻求最小二乘解;m

求解非线性方程实验报告

一.实验目的: 通过本节实验课的学习,要求我们理解并掌握二分法、不动点迭代、牛顿切线法及弦截法解非线性方程求根的原理,掌握相应的算法原理,通过计算机解决实验问题 二.实验内容: 1、用对分区间法方程 1-x-sinx=0 在区间[0,1]上的误差小于10^(-4)的一个根,并记录对方区间的次数。 2、用不动点迭代法求解方程下 x-log(x)=2(x>1) 要求相对误差容限e=10^(-8)。 3、用Newton法求方程 x^3-x-1=0 在区间[-3,3]上的误差不大于10^(-5)的根,分别取初值x0=1.5, x0=0, x0=-1进行计算,比较他们的迭代次数。 三. 实验方案(程序设计说明)[包括算法设计思路,必要的流程图,界面设计 说明、使用模块及变量的说明等。] 1、二分法是对区间收索法的一种改进,具体做法为:先求一区间的中点,并计算其 函数值,若恰好有函数值为0,就是方程的根,若不为0,在判断此点的函数值与两端的函数值乘积的情况,取小于0的那个端点在进行上述对分,直到满足要求为止。 2、迭代法分为两种,一种是从任何可取的初值出发都能保证收敛,称之为大范围收 敛的方法。另一类称之为局部收敛法,即为了保证收敛必须选取初值充分接近于所要求的解。迭代法的基本思想是一种逐渐逼近的方法,首先给定一个粗造的初值,然后用一个迭代公式,反复矫正这个初值,直到满足预先给出的精确要求为止。 3、双点弦接法与Newton法不同,两者有本质的区别,它分为两步,不属于不动点 迭代法。 四. 实验步骤或程序(经调试后正确的源程序) (填写主要步骤与程序代码等,不够可附页) 1、f=inline('x+sin(x)-1'); a=0; b=1; dlt=1.0e-4; k=1; while abs(b-a)>dlt c=(a+b)/2; if f(c)==0 break; elseif f(c)*f(b)<0 a=c;

Matlab求解线性方程组非线性方程组

求解线性方程组 solve,linsolve 例: A=[5 0 4 2;1 -1 2 1;4 1 2 0;1 1 1 1]; %矩阵的行之间用分号隔开,元素之间用逗号或空格 B=[3;1;1;0] X=zeros(4,1);%建立一个4元列向量 X=linsolve(A,B) diff(fun,var,n):对表达式fun中的变量var求n阶导数。 例如:F=sym('u(x,y)*v(x,y)'); %sym()用来定义一个符号表达式 diff(F); %matlab区分大小写 pretty(ans) %pretty():用习惯书写方式显示变量;ans是答案表达式 非线性方程求解 fsolve(fun,x0,options) 为待解方程或方程组的文件名;fun其中 x0位求解方程的初始向量或矩阵; option为设置命令参数 建立文件fun.m: function y=fun(x) y=[x(1)-0.5*sin(x(1))-0.3*cos(x(2)), ... x(2) - 0.5*cos(x(1))+0.3*sin(x(2))]; >>clear;x0=[0.1,0.1];fsolve(@fun,x0,optimset('fsolve')) 注: ...为续行符 m文件必须以function为文件头,调用符为@;文件名必须与定义的函数名相同;fsolve()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。Matlab求解线性方程组 AX=B或XA=B 在MATLAB中,求解线性方程组时,主要采用前面章节介绍的除法运算符“/”和“\”。如: X=A\B表示求矩阵方程AX=B的解; 的解。XA=B表示矩阵方程B/A=X. 对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。 如果矩阵A不是方阵,其维数是m×n,则有: m=n 恰定方程,求解精确解; m>n 超定方程,寻求最小二乘解; m

遗传算法解非线性方程组的Matlab程序

遗传算法解非线性方程组的Matlab程序 程序用MATLAB语言编写。之所以选择MATLB,是因为它简单,但又功能强大。写1行MATLAB程序,相当于写10行C++程序。在编写算法阶段,最好用MATLAB语言,算法验证以后,要进入工程阶段,再把它翻译成C++语言。 本程序的算法很简单,只具有示意性,不能用于实战。 非线性方程组的实例在函数(2)nonLinearSumError1(x)中,你可以用这个实例做样子构造你自己待解的非线性方程组。 %注意:标准遗传算法的一个重要概念是,染色体是可能解的2进制顺序号,由这个序号在可能解的集合(解空间)中找到可能解 %程序的流程如下: %程序初始化,随机生成一组可能解(第一批染色体) %1: 由可能解的序号寻找解本身(关键步骤) %2:把解代入非线性方程计算误差,如果误差符合要求,停止计算 %3:选择最好解对应的最优染色体 %4:保留每次迭代产生的最好的染色体,以防最好染色体丢失 %5: 把保留的最好的染色体holdBestChromosome加入到染色体群中 %6: 为每一条染色体(即可能解的序号)定义一个概率(关键步骤) %7:按照概率筛选染色体(关键步骤) %8:染色体杂交(关键步骤) %9:变异 %10:到1 %这是遗传算法的主程序,它需要调用的函数如下。 %由染色体(可能解的2进制)顺序号找到可能解: %(1)x=chromosome_x(fatherChromosomeGroup,oneDimensionSet,solutionSum); %把解代入非线性方程组计算误差函数:(2)functionError=nonLinearSumError1(x); %判定程是否得解函数:(3)[solution,isTrue]=isSolution(x,funtionError,solutionSumError); %选择最优染色体函数: %(4)[bestChromosome,leastFunctionError]=best_worstChromosome(fatherChromosomeGroup,functionError); %误差比较函数:从两个染色体中,选出误差较小的染色体 %(5)[holdBestChromosome,holdLeastFunctionError]... % =compareBestChromosome(holdBestChromosome,holdLeastFunctionError,... % bestChromosome,leastFuntionError) %为染色体定义概率函数,好的染色体概率高,坏染色体概率低 %(6)p=chromosomeProbability(functionError); %按概率选择染色体函数: %(7)slecteChromosomeGroup=selecteChromome(fatherChromosomeGroup,p); %父代染色体杂交产生子代染色体函数 %(8)sonChrmosomeGroup=crossChromosome(slecteChromosomeGroup,2); %防止染色体超出解空间的函数 %(9)chromosomeGroup=checkSequence(chromosomeGroup,solutionSum) %变异函数 %(10)fatherChromosomeGroup=varianceCh(sonChromosomeGroup,0.8,solutionN); %通过实验有如下结果: %1。染色体应当多一些

非线性方程组的求解

非线性方程组的求解 摘要:非线性方程组求解是数学教学中,数值分析课程的一个重要组成部分,作为一门学科,其研究对象是非线性方程组。求解非线性方程组主要有两种方法:一种是传统的数学方法,如牛顿法、梯度法、共轭方向法、混沌法、BFGS 法、单纯形法等。传统数值方法的优点是计算精度高,缺点是对初始迭代值具有敏感性,同时传统数值方法还会遇到计算函数的导数和矩阵求逆的问题,对于某些导数不存在或是导数难求的方程,传统数值方法具有一定局限性。另一种方法是进化算法,如遗传算法、粒子群算法、人工鱼群算法、差分进化算法等。进化算法的优点是对函数本身没有要求,不需求导,计算速度快,但是精度不高。 关键字:非线性方程组、牛顿法、BFGS 法、记忆梯度法、Memetic 算法 1: 三种牛顿法:Newton 法、简化Newton 法、修改的Newton 法【1-3】 求解非线性方程组的Newton 法是一个最基本而且十分重要的方法, 目前使用的很多有效的迭代法都是以Newton 法为基础, 或由它派生而来。 n 个变量n 个方程的非线性方程组, 其一般形式如下: ???????===0),...,(... 0),...,(0),...,(21212211n n n n x x x f x x x f x x x f (1) 式(1)中,),...,(21n i x x x f ( i=1, ?, n) 是定义在n 维Euclid 空间Rn 中开域 D 上 的实值函数。若用向量记号,令: ????????????=n x x x ...X 21,????????????=??????????????====)(...)()(0),...,(...0),..,(0)...,()(2121212,211X f X f X f x x x f x x x f x x x f X F n n n n n

Broyden方法解非线性方程组

用Broyden 方法求解非线性方程 沈欢 北京大学工学院,北京100871 2011年10月26日 摘要 用Broyden 方法求解给定的非线性方程组。 1问题描述 用Broyden 方法计算非线性方程组(x 1+3)(x 32?7)+18=0 (1)sin (x 2e x 1?1)=0(2) 的解,取初始猜测为?→x 0 =(?0.5,1.4)T 。2问题分析 通过观察不难看出(0,1)点是方程的一个精确解。取初始猜测?→x 0=(?0.5,1.4)T 在精确解附近,可以用Broyden 方法求解。设:??????→F (x 1,x 2)=F 1(x 1,x 2)?→i +F 2(x 1,x 2)?→j 其中F 1(x 1,x 2)= (x 1+3)(x 32?7)+18;F 2(x 1,x 2)=sin (x 2e x 1?1)。3Broyden 算法 Broyden 算法类似于牛顿方法,它通过在已知的雅可比矩阵上加上一个修正项得到新的雅可比矩阵,从而避免了牛顿方法计算雅可比矩阵的复杂度。Broyden 算法如图一所示。Broyden 算法说明:a )初始迭代点取?→x 0 =(?0.5,1.4)T ;初始的雅可比矩阵的近似矩阵取为真实的雅可比矩阵,即:A =?F (?→x )= x 32?73(x 1+3)x 22cos (x 2e x 1?1)?x 2?e x 1cos (x 2e x 1?1)?e x 1 (3)1

图1:Broyden方法的算法简图 A0=?F(?→x)= ?4.256014.7000 0.83950.5996 (4) 取精度为10?8。并计算得到?→x1=[?0.0553,1.0281]T。 b)在每步迭代中用?→ x k和??→ x k?1来估计新的雅可比近似矩阵。 A k=A k?1+g k?A k?1.y k y k .y k ?y T k(5) 其中:g k=F(??→ x k?1)?F(?→ x k),y k=??→ x k?1??→ x k。 c)解线性方程 A k??→s=?F(?→ x k)(6)得到位移向量?→ x k,从而计算出新的迭代点; ??→ x k+1=?→ x k+?→s(7) 4计算结果 调用所编写的函数[roots,flag]=Broyden,得到结果roots=[0.0000,1.0000]T,flag=6。说明,当初值取?→x0=(?0.5,1.4)T时,经过6次迭代得到该非线性方程组满足精度要求的解x1=0.0000,x2=1.0000。与理论解比较,Broyden方法给出的结果非常准确,且迭代次数较少,收敛速度很高。 2

非线性方程求根问题

计算机学院上机实践报告 一、目的 1.通过本实验,帮助加深对非线性方程求根方法的构造过程的理解; 2.能将各种方法编写为程序并上机实现; 3.比较各种方法在求解同一非线性方程根时,在收敛情况上的差异。 二、容与设计思想 1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根。 2.方程f(x)=2x3-5x2-19x+42=0在x=3.0附近有根,试写出其三种不同的等价形式以构成三种不同的迭代格式,再用简单迭代法求根,观察这三种迭代是否收敛。 三、使用环境 1. 硬件环境 微型计算机(Intel x86系列CPU)一台 2. 软件环境 Windows2000/XP操作系统 VC++6.0或其它的开发工具。 四、核心代码及调试过程 1.用二分法求方程f(x)=x3-2x-5=0在区间[2 , 3]的根主要代码: void bisect(double a,double b,int max_B) { double root, ya,yb,yroot; int i,actual_B; ya=f(a);yb=f(b); if(ya*yb>0) { printf("method failed!\n"); exit(0); } for(i=1;i<=max_B;i++) { root=(a+b)/2;yroot=f(root); //取当前含根区间的中点 if(yroot==0) { a=root;b=root;} else if(yb*yroot>0) //取含根区间为[a,(a+b)/2]

{ b=root;yb=yroot;} Else //取含根区间为[(a+b)/2,b] { a=root;ya=yroot;} if(fabs(b-a)b)) { printf("re_select a proper initial value x0!\n"); exit(0); } if(fabs(x1-x0)

实验四非线性方程求根

《数值分析》课程设计实验报告 实验四 非线性方程求根 一、问题提出 设方程3()310f x x x =--=有三个实根**121.8793,0.34727,x x ==- *3 1.53209x =-现采用下面六种不同计算格式,求 f(x)=0的根*1 x 或*2x 1、 2 31x x x += 2、 313 x x -= 3、 x = 4、 213 x x =- 5、 x = 6、 32131()31 x x x x x --=-- 二、实验步骤 #include "stdio.h" #include main() { float x0=1.8793; printf("初值是%f\n",x0);/*输出x0*/ float x1,x2,x3; x1=x0; int i; for(i=1;i<21;i++) { x2=(3*x1+1)/(x1*x1);//第一种迭代方式 //x2=(x1*x1*x1-1)/3;//第二种迭代方式

//x2=pow(3*x1+1,1.0/3);//第三种迭代方式 //x2=1/(x1*x1-3);//第四种迭代方式 //x2=sqrt(3+1/x1);//第五种迭代方式 //x2=x1-(1/3.0)*((x1*x1*x1-3*x1-1)/(x1*x1-1));//第六种迭代方式 x3=x2-x1; printf("第%d 次迭代值为%f,相邻两次迭代值差值为%f\n",i,x2,x3);/*输出x2*/ x1=x2; if(x3<0) x3=-x3; if(x3<0.000001)//误差精度 break; } } 当迭代格式为231x x x +=时,实验结果为 由相邻两次迭代值差值结果可知,迭代过程处于发散状态。 当迭代格式为313 x x -=,实验结果为

实验二 非线性方程求根实验报告

实验报告 学院:电子信息工程 实验课程:计算方法 学生姓名: 学号: 专业班级:通信工程 实验二非线性方程求根 1 目的与要求 (1)进一步熟练掌握求解非线性方程的二分法与Newton迭代法。 (2)掌握二分法与Newton迭代法的算法,能运用程序设计语言和此方法编制软件求出任意指定一元三次方程在给定点附近的根。 2 实验内容 用二分法和Newton迭代法求方程 310 x x --=在 1.5 附近的根,精确到 3 10-,输出每次的迭代结果

并统计所用的迭代次数。 3 实验原理 (1)二分法实验原理 取[a,b]区间二等分的中点x1 =(a+b)/2 (1)若f(x1)=0,则x1是f(x)=0的实根。 (2)若f(a)f(x1)<0 成立,则x* 必在区间(a, x1)内,取a1=a,b1= x1;否则x*必在区间(x1,b)内,则取a1= x1,b1=b,这样,得到新区间[a1,b1],其长度为[a,b]的一半。 (3)如此继续下去,进行n次等分 (2)Newton迭代法实验原理 4 程序设计 (1)流程图 二分法程序流程图

Newton迭代法程序流程图

(2)程序代码 ①二分法求非线性方程根#include #include double fun1(double x) {

return x*x*x-x-1; } double fun2(double x1,double x2) { return (x1+x2)/2; } main() { int n=1; float a,b,c; printf("二分法求非线性方程的根\n"); scanf("a=%f,b=%f",&a,&b); if (fun1(a)*fun1(b)<0) { while(fabs(b-a)>1e-3) { c=fun2(a,b); if (fun1(a)*fun1(c)<0) { b=c;

21实验2 解非线性方程实验

vh 实验 2 解非线性方程实验 专业班级 数学122 学号 姓名 报告日期 2014.4.7 . 实验类型:●验证性实验 ○综合性实验 ○设计性实验 实验目的:进一步熟练掌握解非线性方程的二分法算法、Steffensen 算法、牛顿迭代法,提高编程能力和解算非线性方程问题的实践技能。 实验内容:用二分法算法(取[a,b]=[1,2])、Steffensen 算法(取5.10=x )、牛顿迭代法(取5.10=x )解算非线性方程01)(3=--=x x x f 的根 实验原理 二分法算法实验步骤 Steffensen 算法 牛顿迭代法 1 要求上机实验前先编写出程序代码 2 编辑录入程序 3 调试程序并记录调试过程中出现的问题及修改程序的过程 4 经反复调试后,运行程序并验证程序运行是否正确。 5 记录运行时的输入和输出。 实验思考 试验改变 Steffensen 算法的迭代初值进行计算,试验改变 牛顿迭代算法的迭代初值进行计算,分别对比计算结果并作出分析总结 数学建模与应用:请建立数学模型并应用你的程序解决一个物理计算问题--木质球体浸入水中深度问题。假若球体是由密度为ρ=0.638且半径为r=10cm 的长叶松木质球体构成的,问球体浸入水中深度是多少?又假若球体是由密度为ρ=0.638且三个长半轴分别为a=10cm,b=15cm,c=20cm 的长叶松木质椭圆球体构成的,问球体浸入水中深度是多少?(建模可参考课本32页) 实验报告书写要求:根据实验情况和结果撰写并递交实验报告。实验报告应当有算法原理简介,算法流程图,程序代码,运行调试记录,计算结果阐释;对于数学建模的应用问题要有分析建模的过程、求解计算的过程、实际问题解答或阐释的内容。 实验总结(学会了......; 掌握了......; 训练了......; 发现了......; 今后学习中......有待提高。) 参考程序 1.用二分法算法(取[a,b]=[1,2]) 解算非线性方程01)(3=--=x x x f 的根 function [c,err,yc]=bisect(f,a,b,delta)

c++求解非线性方程组的牛顿顿迭代法

牛顿迭代法c++程序设计 求解{0=x*x-2*x-y+0.5; 0=x*x+4*y*y-4; }的方程 #include #include #define N 2 // 非线性方程组中方程个数、未知量个数 #define Epsilon 0.0001 // 差向量1范数的上限 #define Max 100 //最大迭代次数 using namespace std; const int N2=2*N; int main() { void ff(float xx[N],float yy[N]); //计算向量函数的因变量向量yy[N] void ffjacobian(float xx[N],float yy[N][N]);/ /计算雅克比矩阵yy[N][N] void inv_jacobian(float yy[N][N],float inv[N][N]); //计算雅克比矩阵的逆矩阵inv void newdundiedai(float x0[N], float inv[N][N],float y0[N],float x1[N]); //由近似解向量x0 计算近似解向量x1 float x0[N]={2.0,0.25},y0[N],jacobian[N][N],invjacobian[N][N],x1[N],errornorm; int i,j,iter=0; //如果取消对x0的初始化,撤销下面两行的注释符, 就可以由键盘向x0读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

相关文档
最新文档