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

合集下载

matlab fsolve 算法

matlab fsolve 算法

matlab fsolve 算法Matlab是一种常用的科学计算软件,其中的fsolve算法是用于求解非线性方程组的一种方法。

本文将介绍fsolve算法的原理和使用方法,并通过实例展示其在实际问题中的应用。

一、fsolve算法原理fsolve算法是一种数值方法,用于求解非线性方程组。

它基于牛顿迭代法,通过不断迭代逼近方程组的解。

具体原理如下:1. 假设要求解的方程组为F(x) = 0,其中x为未知向量,F为非线性函数。

2. 首先,我们需要对方程组进行线性化,即将其转化为形如J(x)Δx = -F(x)的线性方程组,其中J(x)为方程组F(x)的雅可比矩阵,Δx为x的增量。

3. 初始时,我们给定一个初始解x0。

4. 然后,利用初始解和雅可比矩阵,通过求解线性方程组J(x0)Δx = -F(x0),得到增量Δx。

5. 将增量Δx加到初始解x0上,得到新的解x1 = x0 + Δx。

6. 重复步骤4和步骤5,直到满足终止准则,即F(x)的范数小于某个给定的容差。

二、fsolve算法使用方法在Matlab中,可以使用fsolve函数调用fsolve算法来求解非线性方程组。

其基本语法如下:x = fsolve(fun,x0,options)其中,fun为一个函数句柄,表示要求解的方程组F(x) = 0,x0为初始解向量,options为求解选项。

三、fsolve算法应用实例下面通过一个实际问题来演示fsolve算法的应用。

假设有一个非线性方程组:sin(x) + cos(y) = 1exp(x) + y = 2我们的任务是求解方程组的解。

我们需要将方程组转化为函数形式。

在Matlab中,我们可以定义一个函数文件,例如:function F = equations(x)F(1) = sin(x(1)) + cos(x(2)) - 1;F(2) = exp(x(1)) + x(2) - 2;然后,我们可以使用fsolve函数来求解方程组:x0 = [0,0]; % 初始解向量options = optimoptions('fsolve','Display','iter'); % 设置求解选项x = fsolve(@equations,x0,options); % 调用fsolve算法求解方程组我们可以将求解的结果打印出来:disp(['x = ', num2str(x(1))]);disp(['y = ', num2str(x(2))]);通过运行上述代码,我们可以得到方程组的解x = 0.7854,y = 1.2146。

牛顿迭代法解非线性方程组(MATLAB版)

牛顿迭代法解非线性方程组(MATLAB版)

⽜顿迭代法解⾮线性⽅程组(MATLAB版)⽜顿迭代法,⼜名切线法,这⾥不详细介绍,简单说明每⼀次⽜顿迭代的运算:⾸先将各个⽅程式在⼀个根的估计值处线性化(泰勒展开式忽略⾼阶余项),然后求解线性化后的⽅程组,最后再更新根的估计值。

下⾯以求解最简单的⾮线性⼆元⽅程组为例(平⾯⼆维定位最基本原理),贴出源代码:1、新建函数fun.m,定义⽅程组1 function f=fun(x);2 %定义⾮线性⽅程组如下3 %变量x1 x24 %函数f1 f25 syms x1 x26 f1 = sqrt((x1-4)^2 + x2^2)-sqrt(17);7 f2 = sqrt(x1^2 + (x2-4)^2)-5;8 f=[f1 f2];2、新建dfun.m,求出⼀阶微分⽅程1 function df=dfun(x);2 f=fun(x);3 df=[diff(f,'x1');diff(f,'x2')]; %雅克⽐矩阵3、建⽴newton.m,执⾏⽜顿迭代过程1 clear;clc2 format;3 x0=[0 0]; % 迭代初始值4 eps = 0.00001; % 定位精度要求5for i = 1:106 f = double(subs(fun(x0),{'x1''x2'},{x0(1) x0(2)}));7 df = double(subs(dfun(x0),{'x1''x2'},{x0(1) x0(2)})); % 得到雅克⽐矩阵8 x = x0 - f/df;9if(abs(x-x0) < eps)10break;11 end12 x0 = x; % 更新迭代结果13 end14 disp('定位坐标:');15 x16 disp('迭代次数:');17 i结果如下:定位坐标:x =0.0000 -1.0000迭代次数:i =4。

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

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

非线性方程组求解的牛顿迭代法用MATLAB实现首先,我们需要定义非线性方程组。

假设我们要求解方程组:```f1(x1,x2)=0f2(x1,x2)=0```其中,`x1`和`x2`是未知数,`f1`和`f2`是非线性函数。

我们可以将这个方程组表示为向量的形式:```F(x)=[f1(x1,x2);f2(x1,x2)]=[0;0]```其中,`F(x)`是一个列向量。

为了实现牛顿迭代法,我们需要计算方程组的雅可比矩阵。

雅可比矩阵是由方程组的偏导数组成的矩阵。

对于方程组中的每个函数,我们可以计算其对每个变量的偏导数,然后将这些偏导数组成一个矩阵。

在MATLAB中,我们可以使用`jacobi`函数来计算雅可比矩阵。

以下是一个示例函数的定义:```matlabfunction J = jacobi(x)x1=x(1);x2=x(2);J = [df1_dx1, df1_dx2; df2_dx1, df2_dx2];end```其中,`x`是一个包含未知数的向量,`df1_dx1`和`df1_dx2`是`f1`对`x1`和`x2`的偏导数,`df2_dx1`和`df2_dx2`是`f2`对`x1`和`x2`的偏导数。

下一步是实现牛顿迭代法。

牛顿迭代法的迭代公式为:```x(k+1)=x(k)-J(x(k))\F(x(k))```其中,`x(k)`是第`k`次迭代的近似解,`\`表示矩阵的求逆操作。

在MATLAB中,我们可以使用如下代码来实现牛顿迭代法:```matlabfunction x = newton_method(x_initial)max_iter = 100; % 最大迭代次数tol = 1e-6; % 收敛阈值x = x_initial; % 初始解for k = 1:max_iterF=[f1(x(1),x(2));f2(x(1),x(2))];%计算F(x)J = jacobi(x); % 计算雅可比矩阵 J(x)delta_x = J \ -F; % 计算增量 delta_xx = x + delta_x; % 更新 xif norm(delta_x) < tolbreak; % 达到收敛条件,停止迭代endendend```其中,`x_initial`是初始解的向量,`max_iter`是最大迭代次数,`tol`是收敛阈值。

数值分析 第二章 基于MATLAB的科学计算—非线性方程(组)

数值分析 第二章 基于MATLAB的科学计算—非线性方程(组)

科学计算—理论、方法及其基于MATLAB 的实现与分析解非线性方程(组)(一)直接法二分法:设方程()0=x f 在区间[]b a ,上有唯一解,并且()()0<b f a f ,如方程()f x x x x x =-++=3223030.sin .(1)首先要确定适当的包含根的区间,这可以依据闭区间上连续函数的介值定理来确定,例如,()f 1110=-+<sin ,()f 222090=->sin .,所以方程 (1)至少有一个实根属于区间[]12,,图1表明区间[]12,中只含有一个根,显然方程 (1)的根不易直接求得。

在区间[-1,0]、[0,1]和[1,2]的情形,如下图1所示 例1 plotNL_fun01.mplotNL_fun01clearx=-1:0.05:2;f=x.^3-2.3*x.^2+x.*sin(x)+0.3; plot(x,f,'r',x,0*x,'k')title('The Image of f(x)=x^3-2.3*x^2+x*sin(x)+0.3') xlabel('\fontsize {12} \fontname {宋体} 图1') axis square二分法的求根过程:用*x 表示方程()0=x f 在区间[]b a ,上的根,对于给定的精度要求0>ε,取区间[]b a ,的中点21ba x +=,并按下式进行判断: ()()()()()⎪⎩⎪⎨⎧∈⇒<∈⇒<=⇒=],[0],[001*11*1*11b x x b f x f x a x a f x f x x x f (2) 以()()01<a f x f 为例,如果ε≤-2ab ,那么区间[]1,x a 内的任何一点都可以作为方程()0=x f 的近似根。

二分法适用于一个方程的场合,收敛速度是线性的,二分次数的估计:()b aN b a N-≤⇒≥--22εεln ln ln (3) 2、黄金分割法:在区间[]b a ,内取对称的两点:()()()⎩⎨⎧-+=--+=a b a x a b a x ββ211 (4) 使得()()()()()618.025125101102221≈+-=−−→−±-=⇒=-+⇒--=--=--=--->ββββββββa b a b ab a x a x a x a b a b按这种方法选取点1x 和2x ,每次去掉的区间长度至少是原区间长度的0.618倍,()()()()()()()()⎪⎪⎩⎪⎪⎨⎧∉∈⇒<⋃∉∈⇒<∉∈⇒<=⇒==⇒=],[],[0],[],[],[0],[],[0002*2*221*21*211*1*1*22*11x a x b x x b f x f b x x a x x x x x f x f b x x x a x a f x f x x x f x x x f (5) 适用于一个方程的场合,收敛速度是线性的,迭代次数的估计:()()215lnln ln 215--->⇔<⎪⎪⎭⎫ ⎝⎛--a b N a b Nεε (6) (二)迭代法首先将方程(组)写成等价的迭代形式:()()0f x x x ϕ=⇔= (7)由此确定了相应的迭代法:()[]10,n n x x x a b ϕ+=⎧⎪⎨∀∈⎪⎩ (8)迭代收敛的图像解释对于非线性方程(组)的迭代法来说,同样面临收敛性问题,为说明收敛性条件,先看下面的例子:例2:让我们来求如下方程的根()f x x x x x =-++=3223030.sin .下面,我们采用迭代法求方程 (1)位于区间]01[,-中的根,为此构造迭代算法如下:()()x x xx g x -+==3.2sin 3.0 (9)()()x g x x x x n n nn n +==+-10323.sin ., n =12,, (10)在区间]01[,-中任取一个迭代初值x 0,如取初值8.00-=x .执行下面的程序:EqutIteration.m:open EqutIteration.m EqutIterationN =29下面欲求1.5附近的根,为此分别取初值4.10=x ,9.10=x ,迭代的结果如下:open Ex_IteraConv01 Ex_IteraConv01N = 31收敛性定理:(收敛的充分性条件)设方程()f x =0在[]a b ,上存在唯一解,()x g x =是方程的等价形式,如果1、()g x 在[]a b ,上连续可微; 2、对任何x a b ∈[],,()g x a b ∈[],; 3、()'≤<g x L 1,则对任何x a b 0∈[],,由迭代算法()x g x n n +=1, (11)生成的序列{}x n 收敛于方程()f x =0在[]a b ,上的唯一解。

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

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

实验一:非线性方程求解程序1:二分法:syms f x;f=input('请输入f(x)=');A=input('请输入根的估计范围[a,b]='); e=input('请输入根的误差限e='); while (A(2)-A(1))>ec=(A(1)+A(2))/2;x=A(1);f1=eval(f);x=c;f2=eval(f);if (f1*f2)>0A(1)=c;elseA(2)=c;endendc=(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-005c=1.404413a=1.404411b=1.4044152.请输入f(x)=x^3-x-1请输入根的估计范围[a,b]=[1,1.5]请输入根的误差限e=0.5e-005c=1.324717a=1.324715b=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)x=x0;if abs(eval(f))<e1fprintf('奇异!\nx=%.6f\n迭代次数为:%d\n',x0,k)breakelsex1=x0-eval(f)/eval(df);if abs(x1-x0)<e2fprintf('x=%.6f\n迭代次数为:%d\n',x1,k)breakelsex0=x1;k=k+1;endendendif k>=Nfprintf('失败\n')end用newton法计算方程:1.请输入f(x)=x*exp(x)-1请输入迭代初值x0=0.5请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10x=0.567143迭代次数为:42.请输入f(x)=x^3-x-1请输入迭代初值x0=1请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10x=1.324718迭代次数为:53.1:请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.45请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10x=0.500000迭代次数为:43.2:请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.65请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10x=0.500000迭代次数为:93.3:请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.55请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10x=0.500000迭代次数为:4程序3:改进的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)x=x0;if abs(eval(f))<e1fprintf('奇异!\nx=%.6f\n迭代次数为:%d\n',x0,k)breakelsex1=x0-2*eval(f)/eval(df);if abs(x1-x0)<e2fprintf('x=%.6f\n迭代次数为:%d\n',x1,k)breakelsex0=x1;k=k+1;endendendif k>=Nfprintf('失败\n')end用改进的newton法计算方程:1.请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.55请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=10失败2.请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.55请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=20失败3.请输入f(x)=(x-1)^2*(2*x-1)请输入迭代初值x0=0.55请输入奇异判断e1=0.1e-010请输入根的误差限e2=0.5e-005请输入迭代次数限N=100失败。

matlab程序设计实践-牛顿法解非线性方程

matlab程序设计实践-牛顿法解非线性方程

中南大学MATLAB程序设计实践学长有爱奉献,下载填上信息即可上交,没有下载券的自行百度。

所需m文件照本文档做即可,即新建(FILE)→脚本(NEW-Sscript)→复制本文档代码→运行(会跳出保存界面,文件名默认不要修改,保存)→结果。

第一题需要把数据文本文档和m文件放在一起。

全部测试无误,放心使用。

本文档针对做牛顿法求非线性函数题目的同学,当然第一题都一样,所有人都可以用。

←记得删掉这段话班级:学号:姓名:一、《MATLAB程序设计实践》Matlab基础表示多晶体材料织构的三维取向分布函数(f=f(φ1,φ,φ2))是一个非常复杂的函数,难以精确的用解析函数表达,通常采用离散空间函数值来表示取向分布函数,是三维取向分布函数的一个实例。

由于数据量非常大,不便于分析,需要借助图形来分析。

请你编写一个matlab程序画出如下的几种图形来分析其取向分布特征:(1)用Slice函数给出其整体分布特征;"~(2)用pcolor或contour函数分别给出(φ2=0, 5, 10, 15, 20, 25, 30, 35 … 90)切面上f分布情况(需要用到subplot函数);(3) 用plot函数给出沿α取向线(φ1=0~90,φ=45,φ2=0)的f分布情况。

(备注:数据格式说明解:(1)((2)将文件内的数据按照要求读取到矩阵f(phi1,phi,phi2)中,代码如下:fid=fopen('');for i=1:18tline=fgetl(fid);endphi1=1;phi=1;phi2=1;line=0; f=zeros(19,19,19);[while ~feof(fid)tline=fgetl(fid);data=str2num(tline);line=line+1;数据说明部分,与作图无关此方向表示f随着φ1从0,5,10,15,20 …到90的变化而变化此方向表示f随着φ从0,5,10,15, 20 …到90的变化而变化表示以下数据为φ2=0的数据,即f(φ1,φ,0)if mod(line,20)==1phi2=(data/5)+1;phi=1;else~for phi1=1:19f(phi1,phi,phi2)=data(phi1);endphi=phi+1;endendfclose(fid);。

牛顿法解非线性方程(MATLAB和C++)

牛顿法解非线性方程(MATLAB和C++)

41 end
42 time = toc;
43
44 fprintf('\nIterated times is %g.\n', times);
45 fprintf('Elapsed time is %g seconds.\n', time);
46
47 root = x_iter;
48
49 % subfunction
5
6 // 功能描述:求解非线性方程根,并输出最终解 7 // 迭代式:x(k+1) = x(k) - f(x(k))/df(x(k)). 8 // 使用:修改标出的“修改”部分即可自定义参数
9
10 // 输入:函数 fun,函数导数 dfun,初值 x0,
4
11 // 最大迭代次数 maxiter,停止精度 tol 12 // 输出:迭代数值解 x_iter2
2
Listing 1: MATLAB EXAMPLE 1 % 2013/11/20 15:14:38
2
3 f = @(x)x^2 − 2; 4 df = @(x)2*x; 5 x0 = 3; 6 root = newton(f, df, x0);
C++ 以 C++ 实现的方法并未编写成为一般可调用的方法,而作为一个独立的 文件(包含一个实例),修改部分即可求解对应的方程。具体参照 cpp 文件内 注释。
A 附录
A.1 MATLAB
Listing 2: MATLAB CODE 1 function root = newton(f, df, x0, maxiter, tol) 2 %NEWTON Newton's method for nonlinear equations. 3% 4 % NEWTON's method: x(k+1) = x(k) - f(x(k))/f'(x(k)). 5% 6 % Inputs 7 % f - nonlinear equation. 8 % df - derivative of f(x). 9 % x0 - initial value. 10 % maxiter - maximum iterated times. 11 % tol - precision. 12 % 13 % Outputs 14 % root - root of f(x) = 0.

非线性方程组求解及matlab实现讲解

非线性方程组求解及matlab实现讲解

x0
X
例:牛顿法计算x^2-25=0的解
f(x)=x2-25,则f’(x)=2x 可构造迭代公式如下:
xi2 25 xi 1 xi 2 xi
取x0=2代入上式,得x1=7.25,继续递推, 依次得5.35、5.0114、5.000001、5.0000000001 …
牛顿法注意事项

逐步扫描法计算示例-方程x2-2=0的正数解
计算方程 x 2 2 0 的正数解
二分法

若函数f(x)在区间[a,b]内单调连续,且f(a)f(b)<0, 则在闭区间[a,b]内必然存在方程f(x)=0的根x*
二分法的图形解释 二分法的MATLAB程序
k=0; while abs(b-a)>eps x=(a+b)/2; if sign(f(x))==sign(f(b)) b=x; else a=x; end k=k+1; end


f '( x) 0, f "( x) 连续且不变号,则只 在有根区间[a,b]上, 要选取的初始近似根x0满足 f ( x0 ) f "( x0 ) 0 ,切线法 必定收敛。 在单根附近,牛顿公式恒收敛,而且收敛速度很快。 但是需要注意如果初始值不在根的附近,牛顿公式 不一定收敛 在实际使用中,牛顿法最好与逐步扫描法结合起来, 先通过逐步扫描法求出根的近似值,然后用牛顿公 式求其精确值,以发挥牛顿法收敛速度快的优点
c x
不动点迭代法

从给定的初值x0,按上式可以得到一个数列: { x0, x1, x2, …, xk, … }
如果这个数列有极限,则迭代格式是收敛的。 * x xk 就是方程的根 这时数列{xk}的极限 lim k 上述求非线性代数方程式数值解的方法称为直 接迭代法(或称为不动点迭代法)。这个方法 虽然简单,但根本问题在于当k->∞时,xk是否 收敛于x*,也就是必须找出收敛的充分条件
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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)<eps
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。

相关文档
最新文档