matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组
matlab实现牛顿迭代法求解非线性方程组

matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下

3*x1-cos(x2*x3)-1/2=0

x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0

exp(-x1*x2)+20*x3+(10*pi-3)/3=0

求解要求精度达到0.00001 ————————————————————————————————

首先建立函数fun

储存方程组编程如下将fun.m保存到工作路径中:

function f=fun(x);

%定义非线性方程组如下

%变量x1 x2 x3

%函数f1 f2 f3

syms x1 x2 x3

f1=3*x1-cos(x2*x3)-1/2;

f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06;

f3=exp(-x1*x2)+20*x3+(10*pi-3)/3;

f=[f1 f2 f3]; ————————————————————————————————

建立函数dfun

用来求方程组的雅克比矩阵将dfun.m保存到工作路径中:

function df=dfun(x);

%用来求解方程组的雅克比矩阵储存在dfun中

f=fun(x);

df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')];

df=conj(df'); ————————————————————————————————

编程牛顿法求解非线性方程组将newton.m保存到工作路径中:

function x=newton(x0,eps,N);

con=0;

%其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N;

f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});

df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)});

x=x0-f/df;

for j=1: length(x0);

il(i,j)=x(j);

end

if norm(x-x0)

con=1;

break;

end

x0=x;

end

%以下是将迭代过程写入txt文档文件名为iteration.txt

fid=fopen('iteration.txt','w');

fprintf(fid,'iteration');

for j=1:length(x0)

fprintf(fid,' x%d',j);

end

for j=1:i

fprintf(fid,'\n%6d ',j);

for k=1:length(x0)

fprintf(fid,' %10.6f',il(j,k));

end

end

if con==1

fprintf(fid,'\n计算结果收敛!');

end

if con==0

fprintf(fid,'\n迭代步数过多可能不收敛!');

end

fclose(fid); ————————————————————————————————

运行程序在matlab中输入以下内容

newton([0.1 0.1 -0.1],0.00001,20) ————————————————————————————————

输出结果

——————————————————————————————————————————在iteration中查看迭代过程 iteration x1 x2 x3

.mulStablePoint用不动点迭代法求非线性方程组的一个根

function [r,n]=mulStablePoint(F,x0,eps)

%非线性方程组:f

%初始解:a

%解的精度:eps

%求得的一组解:r

%迭代步数:n

if nargin==2

eps=1.0e-6;

end

x0 = transpose(x0);

n=1;

tol=1;

while tol>eps

r= subs(F,findsym(F),x0); %迭代公式

tol=norm(r-x0); %注意矩阵的误差求法,

norm为矩阵的欧几里德范数

n=n+1;

x0=r;

if(n>100000) %迭代步数控制

disp('迭代步数太多,可能不收敛!');

return;

end

end

x0=[0 0 0];

[r,n,data]=budong(x0);

disp('不动点计算结果为')

x1=[1 1 1];

x2=[2 2 2];

[x,n,data]=new_ton(x0);

disp(’初始值为0,牛顿法计算结果为:’)

[x,n,data]=new_ton(x1);

disp('初始值为1,牛顿法计算结果为:')

[x,n,data]=new_ton(x2);

disp ('初始值为2,牛顿法计算结果为:')

budong.m

function[r,n,data]=budong(x0, tol)

if nargin=-1

tol=1e-3:

end

x1=budong fun(x0);

n=1;

while(norm(x1-x0))tol)&(n500)

x0=x1;

x1=budong_fun(x0);

n=n+1:

data(:,n)=x1;

end

r=x1:

new_ton.m

function [x,n,data]=new_ton(x0, tol)

if nargin=-1

tol=1e-8;

end

x1=x0-budong_fun(x0)/df1(x0);

n=1;

while (norm(x1-x0))tol)

x0=x1;

x1=x0-budong_fun(x0)/df1(x0);

n=n+1;

data(:,n)=x1;

end

x=x1;

budong_fun.m

function f=budong_fun(x)

f(1)=3* x(1)-cos(x(2)*x(3))-1/2;

f(2)=x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06; f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;

f=[f(1)*f(2)*f(3)];

df1.m

function f=df1(x)

f=[3sin(x(2)*x(3))*x(3) sin(x(2)*x(3))*x(2) 2* x(1)-162*(x(2)+0.1)cos(x(3))

exp(-x(1)*x(2))*(-x(2))exp(-x(1)*x(2))*(-x(1))20]; 结果:

不动点计算结果为

r=

1.0e+012*

NaN -Inf 5.6541

初始值为0,牛顿法计算结果为:

x=

0.5000 -0.0000 -0.5236

初始值为1,牛顿法计算结果为:

x=

0.5000 0.0000 -0.5236

初始值为2,牛顿法计算结果为:

x=

0.5000 0.0000 -0.5236

matlab实现牛顿迭代法求解非线性方程组教学文稿

matlab实现牛顿迭代法求解非线性方程组 已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到0.00001 ———————————————————————————————— 首先建立函数fun 储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x); %定义非线性方程组如下 %变量x1 x2 x3 %函数f1 f2 f3 syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+0.1)^2+sin(x3)+1.06; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1 f2 f3]; ———————————————————————————————— 建立函数dfun 用来求方程组的雅克比矩阵将dfun.m保存到工作路径中: function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun中 f=fun(x); df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df'); ———————————————————————————————— 编程牛顿法求解非线性方程组将newton.m保存到工作路径中: function x=newton(x0,eps,N); con=0; %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N; f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); x=x0-f/df; for j=1: length(x0); il(i,j)=x(j); end if norm(x-x0)

牛顿迭代法解元方程组以及误差分析matlab实现

.0],;,[0 ),()(),()(),(0),()(),()(),(,.**,0],;,[),()()(),()()(,0),(),(),(])()[(),(),(),(),(),(])()[(),(),(2,),(])()[(21),(])()[(),(),()(2 )(''))((')()(: 1n 1n 110101010100000000000000000000000000200000000000 00 000fg g f y y g f g f g f fg x x g g f f y x g y y y x g x x y x g y x f y y y x f x x y x f y x y x y x g f g f fg g f y y g f g f g f fg x x g f g f fg g f y y g f g f g f fg x x g g f f y x g y x g y y y x g x x y x f y x f y y y x f x x y x g y x f y x g y y y x x x y x g y x g y x f y x g y x f y y y x x x y x f y x f y x y x f y y y x x x y x f y y y x x x y x f y x f x x f x x x f x f x f x x n n x y y x y y y x y x n n y n n n x n n n n n y n n n x n n n n n x y y x x x x y y x y y x y y x x x x y y x y y y x y x y x y x y y x x y y x x y x y y x x ,则其解可记为: 的行列式不为若系数矩阵: 附近的线性化方程组为在一元方程牛顿迭代法,类似 ,的新近似值于是就得到了根,则可得解: 的行列式不为若系数矩阵),(),( ),(),( 则两式构成方程组: 令可得: 构成二元方程组,同样与若另有一方程: 阶小项,得到线性方程忽略在方程根附近取值时,当二元函数的展开为: 开类似一元函数的泰勒展?????+-+=-+-+=?????=-+-+=-+-+??? ????-+-+=-+-+=????????-+-=--+-=-?????-=-+--=-+-==??-+??-+=??-+??-+=??-+??-+??-+??-+=-+ -+=++========η ξξ

牛顿迭代法

牛顿迭代法 李保洋 数学科学学院信息与计算科学学号:060424067 指导老师:苏孟龙 摘要:牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法,即牛顿迭代法.迭代法是一种不断用变量的旧值递推新值的过程.跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“牛顿迭代法”属于近似迭代法,本文主要讨论的是牛顿迭代法,方法本身的发现和演变和修正过程,避免二阶导数计算的Newton迭代法的一个改进,并与中国古代的算法,即盈不足术,与牛顿迭代算法的比较. 关键词:Newton迭代算法;近似求解;收敛阶;数值试验;中国古代数学; 九章算术;Duffing方程;非线性方程;收敛速度;渐进性 0 引言: 迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法或者称为一次解法,即一次性解决问题.迭代法又分为精确迭代和近似迭代.“二分法”和“牛顿迭代法”属于近似迭代法. 迭代算法是用计算机解决问题的一种基本方法.它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值.具体使用迭代法求根时应注意以下两种可能发生的情况: (1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制. (2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败. 所以利用迭代算法解决问题,需要做好以下三个方面的工作: 1、确定迭代变量.在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 2、建立迭代关系式.所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系).迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成. 3、对迭代过程进行控制,在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题.不能让迭代过程无休止地重复执行下去.迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定.对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件. 1牛顿迭代法:

二分法和牛顿法求解非线性方程(C语言)

(1)二分法求解非线性方程: #include #include #define f(x)((x*x-1)*x-1) void main() {float a,b,x,eps; int k=0; printf("intput eps\n");/*容许误差*/ scanf("%f",&eps); printf("a,b=\n"); for(;;) {scanf("%f,%f",&a,&b); if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/ printf("二分法不可使用,请重新输入:\n"); else break; } do {x=(a+b)/2; k++; if(f(a)*f(x)<0)/*如果f(a)*f(x)<0,则根在区间的左半部分*/ b=x; else if(f(a)*f(x)>0)/*否则根在区间的右半部分*/ a=x; else break; }while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2;/*取最后的小区间中点作为根的近似值*/ printf("\n The root is x=%f,k=%d\n",x,k); } 运行结果: intput eps 0.00001 a,b= 2,-5 The root is x=1.324721,k=20 Press any key to continue 总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单根。 (2)牛顿法求解非线性方程: #include #include float f(float x)/*定义函数f(x)*/ {return((-3*x+4)*x-5)*x+6;} float f1(float x)/*定义函数f(x)的导数*/

MATLAB程序(牛顿法及线形方程组)

MATLAB 程序 1、图示牛顿迭代法(M 文件)文件名:newt_g function x = new_g(f_name,x0,xmin,xmax,n_points) clf,hold off % newton_method with graphic illustration del_x = 0.001; wid_x = xmax - xmin; dx = (xmax - xmin)/n_points; xp = xmin:dx:xmax; yp = feval(f_name,xp); plot(xp,yp);xlabel('x');ylabel('f(x)'); title('newton iteration'),hold on ymin = min(yp); ymax = max(yp); wid_y = ymax-ymin; yp = 0. * xp; plot(xp,yp) x = x0; xb = x+999; n=0; while abs(x-xb) > 0.000001 if n > 300 break; end y=feval(f_name,x); plot([x,x],[y,0]);plot(x,0,'o') fprintf(' n = % 3.0f, x = % 12.5e, y = % 12.5e \ n', n, x, y); xsc = (x-xmin)/wid_x; if n < 4, text(x,wid_y/20,[num2str(n)]), end y_driv = (feval(f_name,x + del_x) - y)/del_x; xb = x; x = xb - y/y_driv; n = n+1; plot([xb,x],[y,0]) end plot([x x],[0.05 * wid_y 0.2 * wid_y]) text( x, 0.2 * wid_y, 'final solution') plot([ x ( x - wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y]) plot([ x ( x + wid_x * 0.004)], [0.01 * wid_y 0.09 * wid_y]) 传热问题 假设一个火炉是用厚度为0.05m 的砖单层砌成的。炉内壁温度为T 0=625K, 外壁温度为T 1(未知)。由于对流和辐射造成了外壁的热量损失,温度T 1由下式决定: 44111()()()()0f k f T T T T T h T T x εσ∞=-+-+-=? 其中: k :炉壁的热传导系数,1.2W/mK ε: 发射率,0.8 T 0:内壁温度,625K T 1:外壁温度(未知),K T ∞:环境温度,298K T f :空气温度,298K H :热交换系数,20W/m 2K

牛顿法非线性方程求解

《MATLAB 程序设计实践》课程考核 ---第37-38页 题1 : 编程实现以下科学计算算法,并举一例应用之。(参考书籍《精 通MAT LAB科学计算》,王正林等著,电子工业出版社,2009 年) “牛顿法非线性方程求解” 弦截法本质是一种割线法,它从两端向中间逐渐逼近方程的根;牛顿法本质上是一种切线法,它从一端向一个方向逼近方程的根,其递推公式为: - =+n n x x 1) ()(' n n x f x f 初始值可以取)('a f 和)('b f 的较大者,这样可以加快收敛速度。 和牛顿法有关的还有简化牛顿法和牛顿下山法。 在MATLAB 中编程实现的牛顿法的函数为:NewtonRoot 。 功能:用牛顿法求函数在某个区间上的一个零点。 调用格式:root=NewtonRoot )(```eps b a f 其中,f 为函数名; a 为区间左端点; b 为区间右端点 eps 为根的精度; root 为求出的函数零点。 ,

牛顿法的matlab程序代码如下: function root=NewtonRoot(f,a,b,eps) %牛顿法求函数f在区间[a,b]上的一个零点%函数名:f %区间左端点:a

%区间右端点:b %根的精度:eps %求出的函数零点:root if(nargin==3) eps=1.0e-4; end f1=subs(sym(f),findsym(sym(f)),a); f2=subs(sym(f),findsym(sym(f)),b); if (f1==0) root=a; end if (f2==0) root=b; end if (f1*f2>0) disp('两端点函数值乘积大于0 !'); return; else tol=1; fun=diff(sym(f)); %求导数 fa=subs(sym(f),findsym(sym(f)),a); fb=subs(sym(f),findsym(sym(f)),b); dfa=subs(sym(fun),findsym(sym(fun)),a); dfb=subs(sym(fun),findsym(sym(fun)),b); if(dfa>dfb) %初始值取两端点导数较大者 root=a-fa/dfa; else root=b-fb/dfb; end while(tol>eps) r1=root; fx=subs(sym(f),findsym(sym(f)),r1); dfx=subs(sym(fun),findsym(sym(fun)),r1); %求该点的导数值 root=r1-fx/dfx; %迭代的核心公式 tol=abs(root-r1); end end 例:求方程3x^2-exp(x)=0的一根 解:在MATLAB命令窗口输入: >> r=NewtonRoot('3*x^2-exp(x)',3,4) 输出结果: X=3.7331

牛顿法求非线性方程的根

学科前沿讲座论文 班级:工程力学13-1班姓名:陆树飞

学号:02130827

牛顿法求非线性方程的根 一 实验目的 (1)用牛顿迭代法求解方程的根 (2)了解迭代法的原理,了解迭代速度跟什么有关 题目:用Newton 法计算下列方程 (1) 013=--x x , 初值分别为10=x ,7.00=x ,5.00=x ; (2) 32943892940x x x +-+= 其三个根分别为1,3,98-。当选择初值02x =时 给出结果并分析现象,当6510ε-=?,迭代停止。 二 数学原理 对于方程f(x)=0,如果f(x)是线性函数,则它的求根是很容易的。牛顿迭代法实质上是一种线性化方法,其基本思想是将非线性方程f(x)=0逐步归结为某种线性方程来求解。 设已知方程f(x)=0有近似根x k (假定k f'(x )0≠) ,将函数f(x)在点x k 进行泰勒展开,有 k k k f(x)f(x )+f'(x )(x-x )+≈??? 于是方程f(x)=0可近似的表示为 k k k f(x )+f'(x )(x-x )=0 这是个线性方程,记其根为x k+1,则x k+1的计算公式为 k+1k ()x =x -'() k k f x f x ,k=0,1,2,… 这就是牛顿迭代法。

三 程序设计 (1)对于310x x --=,按照上述数学原理,编制的程序如下 program newton implicit none real :: x(0:50),fx(0:50),f1x(0:50)!分别为自变量x ,函数f(x)和一阶导数f1(x) integer :: k write(*,*) "x(0)=" read(*,*) x(0) !输入变量:初始值x(0) open(10,file='1.txt') do k=1,50,1 fx(k)=x(k-1)**3-x(k-1)-1 f1x(k)=3*x(k-1)**2-1 x(k)=x(k-1)-fx(k)/f1x(k) !牛顿法 write(*,'(I3,1x,f11.6)') k,x(k) !输出变量:迭代次数k 及x 的值 write(10,'(I3,1x,f11.6)') k,x(k) if(abs(x(k)-x(k-1))<1e-6) exit !终止迭代条件 end do stop end (2)对于32943892940x x x +-+=,按照上述数学原理,编制的程序如下 program newton implicit none

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

牛顿迭代法求解非线性方程组 非线性方程组如下: 221122121210801080 x x x x x x x ?-++=??+-+=?? 给定初值()00.0T x =,要求求解精度达到0.00001 1.首先建立函数()F X ,方程编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1),f(2)] ; 2.建立函数()DF X ,用于求方程的jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; %jacobi 矩阵是一阶偏导数以一定方式排列成的矩阵。 3.编程牛顿迭代法解非线性方程组,将newton.m 保存在工作路径中: clear,clc; x=[0,0]'; f=F(x);

df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break; else end end ezplot('x^2-10*x+y^2+8',[-6,6,-6,6]); hold on ezplot('x*y^2+x-10*y+8',[-6,6,-6,6]); 运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117

用牛顿迭代法求近似根

用牛顿迭代法求近似根

————————————————————————————————作者:————————————————————————————————日期:

第四题 题目:用Newton 法求方程在 74 28140x x -+= (0.1,1.9)中的近似根(初始近似值取为区间端点,迭代6次或误差小于0.00001). 解:此题是用牛顿迭代法求解近似根的问题 1. Newton 迭代法的算法公式及应用条件: 设函数在有限区间[a,b]上二阶导数存在,且满足条件 ⅰ. ()()0f a f b <; ⅱ. ()''f x 在区间[a,b]上不变号; ⅲ. ()'0f x ≠; ⅳ. ()()'f c f c b a ≤-,其中c 是a,b 中使()()''min(,)f a f b 达到的一个. 则对任意初始近似值0[,]x a b ∈,由Newton 迭代过程 ()()() 1'k k k k k f x x x x f x +=Φ=-,k=0,1,2… 所生成的迭代序列{ k x }平方收敛于方程()0f x =在区间[a,b]上的唯一解а. 对本题: )9.1()9.1(0 )8(4233642)(0 )16(71127)(0 )9.1(,0)1.0(,1428)(3225333647>?''<-=-=''<-=-='<>+-=f f x x x x x f x x x x x f f f x x x f Θ 故以1.9为起点 ?? ???='-=+9.1)()(01x x f x f x x k k k k 2. 程序编写 #include #include void main() { double x0,x=1.9; do

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的初始化,撤销下面两行的注释符,就可以由键盘x读入初始近似解向量for( i=0;i>x0[i]; cout<<"初始近似解向量:"<

非线性方程组求解的牛顿迭代法用MATLAB实现

1. 二元函数的newton 迭代法理论分析 设),(y x f z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,则有 ?? ? ????? +??+≈++==00) ,(),(),(),(0000y y x x y x f y k y x f x h y x f k y h x f 其中 0x x h -=,0y -=y k 于是方程0),(=y x f 可近似表示为 0) ,(),(),(k =?? ? ????? +??+==k k y y x x k y x f y k y x f x h y x f 即 0),()(),()(),(y k =-+-+k k k k k x k k y x f y y y x f x x y x f 同理,设y)g(x,z =在点),(00y x 的某一邻域内连续且有直到2阶的连续偏导数,),(00h y h x ++为该邻域内任意一点,亦有 ?? ?????? +??+≈++==00),(),(),(),(0000y y x x y x g y k y x g x h y x g k y h x g 其中0x x h -=,0y -=y k 于是方程0),(g =y x 可近似表示为 0) ,(),(),(k =?? ? ????? +??+==k k y y x x k y x g y k y x g x h y x g 即 0),(g )(),()(),(y k =-+-+k k k k k x k k y x y y y x g x x y x g 于是得到方程组 ? ??=-+-+=-+-+0),(g )(),()(),(0),()(),()(),(y k y k k k k k k x k k k k k k k x k k y x y y y x g x x y x g y x f y y y x f x x y x f

2-8牛顿迭代法matlab

实验七 牛顿迭代法 【实验目的】 1.了解牛顿迭代法的基本概念。 2.了解牛顿迭代法的收敛性和收敛速度。 3.学习掌握MATLAB 软件有关的命令。 【实验内容】 用牛顿迭代法求方程0123=-++x x x 的近似根,误差不超过310-。 【实验准备】 1.牛顿迭代法原理 设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大. 设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得 ) (')(0001x f x f x x -= 重复这一过程,得到迭代格式 ) (')(1n n n n x f x f x x -=+ 这就是著名的牛顿迭代公式,它相应的不动点方程为 ) (')()(x f x f x x g -=. 2. 牛顿迭代法的几何解析 在0x 处作曲线的切线,切线方程为))((')(000x x x f x f y -+=。令 0=y ,可得切线与x 轴的交点坐标) (')(0001x f x f x x -=,这就是牛顿法的迭代公式。因此,牛顿法又称“切线法”。

3.牛顿迭代法的收敛性 计算可得2)] ('[)(")()('x f x f x f x g -=,设*x 是0)(=x f 的单根,有0)(',0)(**≠=x f x f ,则 0)]('[)(")()('2**** =-=x f x f x f x g , 故在*x 附近,有1)('>clear; >>x=0.5; >>for i=1:3 >>x=x-(x^3+x^2+x-1)/(3*x^2+2*x+1) >>end 可算得迭代数列的前3项0.5455, 0.5437, 0.5437.近三次迭代,就大大超过了精度要求. 练习2用牛顿迭代法求方程)0(2>=a a x .的近似正实根,由此建立一种求平方根的计算方法. 由计算可知,迭代格式为)(21)(x a x x g += .,在实验12的练习4种已经进行了讨论. 练习3用牛顿迭代法求方程1=x xe 的正根. 牛顿迭代法的迭代函数为

C语言编程_牛顿迭代法求方程2

牛顿迭代公式 设r 是f(x) = 0的根,选取x0作为r 初始近似值,过点(x0,f(x0)) f(x)的切线L ,L 的方程为y = f(x0)+f'(x0)(x-x0),求出L 与x 轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r 的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x 轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r 的二次近似值。重复以上过程,得r 的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r 的n+1次近似值,上式称为牛顿迭代公式。 解非线性方程 f(x)=0似方法。把f(x)在 x0 f(x) = f(x0)+(x -x0)f'(x0)+(x -x0)^2*f''(x0)/2! +… 取其线性部分,作为非线性方程f(x) = 0的近似方程,即泰勒展开的前两项,则有f(x0)+f'(x0)(x -x0)-f(x)=0 设f'(x0)≠0则其解为x1=x0-f(x0)/f'(x0) 这样,得到牛顿法的一个迭代序列:x(n+1)=x(n)-f(x(n))/f'(x(n))。 牛顿迭代法又称牛顿切线法,它采用以下方法求根:先任意设定一个与真实的根接近的值x 0作为第一个近似根,由x 0求出f(x 0),过(x 0,f(x 0))点做f(x)的切线,交x 轴于x 1,把它作为第二次近似根,再由x 1求出f(x 1),再过(x 1,f(x 1))点做f(x)的切线,交x 轴于x 2,再求出f(x 2),再作切线……如此继续下去,直到足够接近真正的x *为止。 ) ()()()(0' 0010 100' x f x f x x x x x f x f - =-= 因此, 就是牛顿迭代公式。 例1 用牛顿迭代法求方程2x 3-4x 2 +3x-6=0在1.5附近的根。 本题中,f(x)= 2x 3-4x 2+3x-6=((2x-4)x+3)x-6 f ’(x)= 6x 2-8x+3=(6x-8)x+3 #include "stdio.h"

Newton迭代法求解非线性方程

Newton迭代法求解非 线性方程

一、 Newton 迭代法概述 构造迭代函数的一条重要途径是用近似方程来代替原方程去求根。因此,如果能将非线性方程f (x )=0用线性方程去代替,那么,求近似根问题就很容易解决,而且十分方便。牛顿(Newton)法就是一种将非线性方程线化的一种方法。 设k x 是方程f (x )=0的一个近似根,把如果)(x f 在k x 处作一阶Taylor 展开,即: )x x )(x ('f )x (f )x (f k k k -+≈ (1-1) 于是我们得到如下近似方程: 0)x x )(x ('f )x (f k k k =-+ (1-2) 设0)('≠k x f ,则方程的解为: x ?=x k +f (x k ) f (x k )? (1-3) 取x ~作为原方程的新近似根1+k x ,即令: ) x ('f ) x (f x x k k k 1k -=+, k=0,1,2,… (1-4) 上式称为牛顿迭代格式。用牛顿迭代格式求方程的根的方法就称为牛顿迭代法,简称牛顿法。 牛顿法具有明显的几何意义。方程: )x x )(x ('f )x (f y k k k -+= (1-5) 是曲线)x (f y =上点))x (f ,x (k k 处的切线方程。迭代格式(1-4)就是用切线式(1-5)的零点来代替曲线的零点。正因为如此,牛顿法也称为切线法。 牛顿迭代法对单根至少是二阶局部收敛的,而对于重根是一阶局部收敛的。一般来说,牛顿法对初值0x 的要求较高,初值足够靠近*x 时才能保证收敛。若

要保证初值在较大范围内收敛,则需对)x (f 加一些条件。如果所加的条件不满足,而导致牛顿法不收敛时,则需对牛顿法作一些改时,即可以采用下面的迭代格式: ) x ('f ) x (f x x k k k 1k λ -=+, ?=,2,1,0k (1-6) 上式中,10<λ<,称为下山因子。因此,用这种方法求方程的根,也称为牛顿下山法。 牛顿法对单根收敛速度快,但每迭代一次,除需计算)x (f k 之外,还要计算 )x ('f k 的值。如果)x (f 比较复杂,计算)x ('f k 的工作量就可能比较大。为了避免计算导数值,我们可用差商来代替导数。通常用如下几种方法: 1. 割线法 如果用 1 k k 1k k x x ) x (f )x (f ----代替)x ('f k ,则得到割线法的迭代格式为: )x (f ) x (f )x (f x x x x k 1k k 1 k k k 1k --+---= (1-7) 2. 拟牛顿法 如果用 ) x (f )) x (f x (f )x (f k 1k k k ---代替)x ('f k ,则得到拟牛顿法的迭代格式为: )) x (f x (f )x (f ) x (f x x 1k k k k 2k 1k -+--- = (1-8) 3. Steffenson 法 如果用 ) x (f ) x (f ))x (f x (f k k k k -+代替)x ('f k ,则得到拟牛顿法的迭代格式为: ) x (f ))x (f x (f ) x (f x x k k k k 2k 1 k -+- =+

基于Matlab的牛顿迭代法解非线性方程组

基于Matlab 实现牛顿迭代法解非线性方程组 已知非线性方程组如下 2211221212 10801080x x x x x x x ?-++=??+-+=?? 给定初值0(0,0)T x =,要求求解精度达到0.00001 首先建立函数F(x),方程组编程如下,将F.m 保存到工作路径中: function f=F(x) f(1)=x(1)^2-10*x(1)+x(2)^2+8; f(2)=x(1)*x(2)^2+x(1)-10*x(2)+8; f=[f(1) f(2)]; 建立函数DF(x),用于求方程组的Jacobi 矩阵,将DF.m 保存到工作路径中: function df=DF(x) df=[2*x(1)-10,2*x(2);x(2)^2+1,2*x(1)*x(2)-10]; 编程牛顿迭代法解非线性方程组,将newton.m 保存到工作路径中: clear; clc x=[0,0]'; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',0,x(1),x(2)); N=4; for i=1:N y=df\f'; x=x-y; f=F(x); df=DF(x); fprintf('%d %.7f %.7f\n',i,x(1),x(2)); if norm(y)<0.0000001 break ; else end end

运行结果如下: 0 0.0000000 0.0000000 1 0.8000000 0.8800000 2 0.9917872 0.9917117 3 0.9999752 0.9999685 4 1.0000000 1.0000000

matlab实验十七__牛顿迭代法

实验十七牛顿迭代法 【实验目的】 1.了解牛顿迭代法的基本概念。 2.了解牛顿迭代法的收敛性和收敛速度。 3.学习、掌握MATLAB软件的有关命令。 【实验内容】 用牛顿迭代法求方程3210 x x x 10-。 ++-=的近似根,误差不超过3【实验准备】 1.牛顿迭代法原理 2.牛顿迭代法的几何解析 3.牛顿迭代法的收敛性 4.牛顿迭代法的收敛速度 5.迭代过程的加速 6.迭代的MATLAB命令 MATLAB中主要用for,while等控制流命令实现迭代。 【实验重点】 1.牛顿迭代法的算法实现 2.牛顿迭代法收敛性和收敛速度 【实验难点】 1.牛顿迭代法收敛性和收敛速度 【实验方法与步骤】 练习1用牛顿迭代法求方程3210 ++-=在x=0.5附近的近似 x x x

根,误差不超过310-。 牛顿迭代法的迭代函数为 322()1()()321 f x x x x g x x x f x x x ++-=-=-'++ 相应的MATLAB 代码为 >>clear; >>x=0.5; >>for i=1:3 >>x=x-(x^3+x^2+x-1)/(3*x^2+2*x+1) >>end 可算的迭代数列的前3项0.5455,0.5437,0.5437。经三次迭代,就大大超过了精度要求。 练习2 用牛顿迭代法求方程2(0)x a a =>的近似正实根,由此建立一种求平方根的计算方法。 由计算可知,迭代格式为1()()2a g x x x =+,在实验12的练习4中已经进行了讨论。 【练习与思考】 1.用牛顿迭代法求方程ln 1x x =的近似根。 2.为求出方程310x x --=的根,在区间[1,2]内使用迭代函数进行迭代,纪录迭代数据,问迭代是否收敛?对迭代进行加速,对比加速前的数据,比较加速效果。 3.使用在不动点*x 的泰勒公式,证明牛顿迭代法收敛原理。

matlab实现牛顿迭代法求解非线性方程组

已知非线性方程组如下 3*x1-cos(x2*x3)-1/2=0 x1^2-81*(x2+^2+sin(x3)+=0 exp(-x1*x2)+20*x3+(10*pi-3)/3=0 求解要求精度达到————————————————————————————————首先建立函数fun 储存方程组编程如下将保存到工作路径中: function f=fun(x); %定义非线性方程组如下 %变量x1 x2 x3 %函数f1 f2 f3 syms x1 x2 x3 f1=3*x1-cos(x2*x3)-1/2; f2=x1^2-81*(x2+^2+sin(x3)+; f3=exp(-x1*x2)+20*x3+(10*pi-3)/3; f=[f1 f2 f3]; ————————————————————————————————建立函数dfun 用来求方程组的雅克比矩阵将保存到工作路径中: function df=dfun(x); %用来求解方程组的雅克比矩阵储存在dfun中 f=fun(x); df=[diff(f,'x1');diff(f,'x2');diff(f,'x3')]; df=conj(df');————————————————————————————————编程牛顿法求解非线性方程组将保存到工作路径中:

function x=newton(x0,eps,N); con=0; %其中x0为迭代初值eps为精度要求N为最大迭代步数con用来记录结果是否收敛for i=1:N; f=subs(fun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); df=subs(dfun(x0),{'x1' 'x2' 'x3'},{x0(1) x0(2) x0(3)}); x=x0-f/df; for j=1: length(x0); il(i,j)=x(j); end if norm(x-x0)

牛顿迭代法求方程的根

利用迭代算法解决问题,需要做好以下三个方面的工作: 一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。 二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。 三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。 最经典的迭代算法是欧几里德算法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 牛顿迭代法是牛顿在17世纪提出的一种求解方程f(x)=0.多数方程不存在求根公式,从而求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。 设r是f(x)=0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y=f(x)的切线L,L的方程为y=f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标x1=x0-f(x0)/f'(x0),称x1为r的一次近似值,过点(x1,f(x1))做曲线y=f(x)的切线,并求该切线与x轴的横坐标 x2=x1-f(x1)/f'(x1)称x2为r的二次近似值,重复以上过程,得r 的近似值序列{Xn},其中Xn+1=Xn-f(Xn)/f'(Xn),称为r的n+1次近似值。上式称为牛顿迭代公式。 /* 用牛顿迭代法求下面方程 x*x*x-5*x*x+16*x-80=0的实根的过程是:

MATLAB计算方法迭代法牛顿法二分法实验报告

姓名 ______________ 实验报告成绩___________________________ 评语: 指导教师(签名) ____________________ 年月日 说明:指导教师评分后,实验报告交院(系)办公室保存。 实验一方程求根 一、实验目的 用各种方法求任意实函数方程f(x) =0在自变量区间[a,b]上,或某一点附近的实 根。并比较方法的优劣。 二、实验原理 (1)、二分法 b「a 对方程f(x)"在[a,b]内求根。将所给区间二分,在分点 -2判断是否 b —a x = ------- f(x)=0;若是,则有根 2 。否则,继续判断是否f(a)?f(x)”0,若是,则令b二X, 否则令a = x。否则令a = x。重复此过程直至求出方程f(x) =0在[a,b]中的近似根为止。 (2)、迭代法 将方程f(x)等价变换为x=? ( x)形式,并建立相应的迭代公式xk1二? (X )。 (3)、牛顿法 若已知方程的一个近似根X。,则函数在点X。附近可用一阶泰勒多项式 Pl(x) "(x。厂f'(X0)(x-X0)来近似,因此方程f(x)=0可近似表示为 f (X o) f(X o厂f'(Xo)(X—X ) =0设f'(X o)",则x = X o—f'(X o)。取X作为原方程新的近似根

f (X k) X1,然后将X1作为X o代入上式。迭代公式为:X k 1 = X o _ f'(X k)。 三、实验设备:MATLAB 7.0软件 四、结果预测 (1)X ii=o.O9O33 (2)X5=0.09052(3)X2=0,09052 五、实验内容 (1)、在区间[0,1]上用二分法求方程e X 10^^0的近似根,要求误差不超过 0.5 10 彳 。 f (X k) (2)、取初值X0 ",用迭代公式I =x。- f'(Xk),求方程e x 10x-2=0的近似根。要求误差不超过0.5 10 "。 (3)、取初值X0 = 0,用牛顿迭代法求方程e一10x - 2 = 0的近似根。要求误差不超过°,5 10“。 六、实验步骤与实验程序 (1)二分法 第一步:在MATLAB 7.0软件,建立一个实现二分法的MATLAB函数文件agui_bisect.m 女口下: fun cti on x=agui_bisect(f name,a,b,e) %fname为函数名,a,b为区间端点,e为精度 fa=feval(fname,a); % 把a端点代入函数,求fa fb=feval(fname,b); % 把b端点代入函数,求fb if fa*fb>0 error(' 两端函数值为同号');

相关文档
最新文档