解非线性方程的数值计算方法 用Matlab实现

合集下载

实验2利用matlab解(非)线性、微分方程(组)

实验2利用matlab解(非)线性、微分方程(组)

实验2 利用matlab 解(非)线性、微分方程(组)
一、实验目的
1、线性方程组的解法:直接求解法和迭代法;
2、非线性方程以及非线性方程组的求解;
3、微分方程的数值解。

二、实验内容
1、对于下列线性方程组:
⎥⎥⎥⎦
⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡66136221143092x
(1) 请用直接法求解;
(2) 请用LU 分解方法求解;
(3) 请用QR 分解方法求解;
(4) 请用Cholesky 分解方法求解。

2、设迭代精度为10-6,分别用Jacobi 迭代法、Gauss-Serdel 迭代法求解下列线性方程组,并比较此两种迭代法的收敛速度。

⎪⎩
⎪⎨⎧=+-=-+-=-510272109103232121x x x x x x x 3、求解非线性方程010=-+-x xe x 在2附近的根。

4、求下列非线性方程组在(0.5,0.5) 附近的数值解。

⎪⎩
⎪⎨⎧=-+=-+02)sin(02)cos(y x xe y ye x 5、通过画图方法描述某非刚性体的运动方程的微分方程⎪⎩⎪⎨⎧=-==2
1131232151.0y y y y y y
y y y ,其初始条件为⎪⎩⎪⎨⎧===1)0(1)0(0)0(3
21y y y 。

6、求二阶微分方程)2sin(3t y e y t y t =-'+'', 1)0(=y ,1)0(-='y 在20≤≤t 时的数值图解。

matlab牛顿拉夫逊法与快速分解法的实现

matlab牛顿拉夫逊法与快速分解法的实现

一、概述MATLAB是一种强大的数学软件工具,它提供了许多优秀的数值计算和数据分析功能。

其中,牛顿拉夫逊法和快速分解法是两种常用的数值计算方法,它们在解决非线性方程组和矩阵分解等问题中具有重要的应用价值。

本文将介绍如何在MATLAB中实现这两种方法,并对它们的优缺点进行详细分析。

二、牛顿拉夫逊法的实现1. 算法原理牛顿拉夫逊法是一种用于求解非线性方程组的迭代算法。

它利用函数的一阶和二阶导数信息来不断逼近方程组的解,直到满足精度要求为止。

算法原理可以用以下公式表示:公式1其中,x表示解向量,F(x)表示方程组的函数向量,J(x)表示方程组的雅可比矩阵,δx表示解的更新量。

通过不断迭代更新x,最终得到方程组的解。

2. MATLAB代码实现在MATLAB中,可以通过编写函数来实现牛顿拉夫逊法。

以下是一个简单的示例代码:在这段代码中,首先定义了方程组的函数向量和雅可比矩阵,然后利用牛顿拉夫逊法进行迭代更新,直到满足精度要求为止。

通过这种方式,就可以在MATLAB中实现牛顿拉夫逊法,并应用于各种实际问题。

三、快速分解法的实现1. 算法原理快速分解法是一种用于矩阵分解的高效算法。

它利用矩阵的特定性质,通过分解为更小的子问题来加速计算过程。

算法原理可以用以下公式表示:公式2其中,A表示要分解的矩阵,L和U分别表示矩阵的下三角和上三角分解。

通过这种分解方式,可以将原始矩阵的计算量大大减小,提高求解效率。

2. MATLAB代码实现在MATLAB中,可以利用内置函数来实现快速分解法。

以下是一个简单的示例代码:在这段代码中,利用MATLAB内置的lu函数进行LU分解,得到矩阵的下三角和上三角分解。

通过这种方式,就可以在MATLAB中实现快速分解法,并应用于各种矩阵计算问题。

四、方法比较与分析1. 算法复杂度牛顿拉夫逊法和快速分解法在计算复杂度上有所不同。

牛顿拉夫逊法的迭代次数取决于所求解问题的非线性程度,通常需要较多的迭代次数。

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

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

matlab实现牛顿迭代法求解非线性方程组已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到0.00001————————————————————————————————首先建立函数fun储存方程组编程如下将fun.m保存到工作路径中: function f=fun(x);%定义非线性方程组如下%变量x1 x2 x3%函数f1 f2 f3syms x1 x2 x3f1=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);endif norm(x-x0)<epscon=1;break;endx0=x;end%以下是将迭代过程写入txt文档文件名为iteration.txtfid=fopen('iteration.txt','w');fprintf(fid,'iteration');for j=1:length(x0)fprintf(fid,' x%d',j);endfor j=1:ifprintf(fid,'\n%6d ',j);for k=1:length(x0)fprintf(fid,' %10.6f',il(j,k));endendif con==1fprintf(fid,'\n计算结果收敛!');endif con==0fprintf(fid,'\n迭代步数过多可能不收敛!'); endfclose(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%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0);%迭代公式tol=norm(r-x0);%注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000)%迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendx0=[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.mfunction[r,n,data]=budong(x0, tol)if nargin=-1tol=1e-3:x1=budong fun(x0);n=1;while(norm(x1-x0))tol)&(n500)x0=x1;x1=budong_fun(x0);n=n+1:data(:,n)=x1;endr=x1:new_ton.mfunction [x,n,data]=new_ton(x0, tol) if nargin=-1tol=1e-8;endx1=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;x=x1;budong_fun.mfunction 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.0 6;f(3)=exp(-x(1)*x(2))+20* x(3)+10* pi/3-1;f=[f(1)*f(2)*f(3)];df1.mfunction 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的科学计算—非线性方程(组)

科学计算—理论、方法及其基于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求解程序

数值分析中求解非线性方程的MATLAB求解程序1. fzero函数:fzero函数是MATLAB中最常用的求解非线性方程的函数之一、它使用了割线法、二分法和反复均值法等多种迭代算法来求解方程。

使用fzero函数可以很方便地求解单变量非线性方程和非线性方程组。

例如,要求解方程f(x) = 0,可以使用以下语法:``````2. fsolve函数:fsolve函数是MATLAB中求解多维非线性方程组的函数。

它是基于牛顿法的迭代算法来求解方程组。

使用fsolve函数可以非常方便地求解非线性方程组。

例如,要求解方程组F(x) = 0,可以使用以下语法:``````3. root函数:root函数是MATLAB中求解非线性方程组的函数之一、它采用牛顿法或拟牛顿法来求解方程组。

使用root函数可以非常方便地求解非线性方程组。

例如,要求解方程组F(x) = 0,可以使用以下语法:``````4. vpasolve函数:vpasolve函数是MATLAB中求解符号方程的函数。

它使用符号计算的方法来求解方程,可以得到精确的解。

vpasolve函数可以求解多变量非线性方程组和含有符号参数的非线性方程。

例如,要求解方程组F(x) = 0,可以使用以下语法:```x = vpasolve(F(x) == 0, x)```vpasolve函数会返回方程组的一个精确解x。

5. fsolve和lsqnonlin结合:在MATLAB中,可以将求解非线性方程转化为求解最小二乘问题的形式。

可以使用fsolve函数或lsqnonlin函数来求解最小二乘问题。

例如,要求解方程f(x) = 0,可以将其转化为最小二乘问题g(x) = min,然后使用fsolve或lsqnonlin函数来求解。

具体使用方法可以参考MATLAB官方文档。

6. Newton-Raphson法手动实现:除了使用MATLAB中的函数来求解非线性方程,还可以手动实现Newton-Raphson法来求解。

非线性方程组求解及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*,也就是必须找出收敛的充分条件

Matlab非线性方程数值解法

Matlab非线性方程数值解法

Matlab⾮线性⽅程数值解法实验⽬的⽤Matlab实现⾮线性⽅程的⼆分法、不动点迭代法实验要求1. 给出⼆分法算法和不动点迭代算法2. ⽤Matlab实现⼆分法3. ⽤Matlab实现不动点迭代法实验内容(1)在区间[0,1]上⽤⼆分法和不动点迭代法求的根到⼩数点后六位。

(2)⼆分法的基本思想:逐步⼆分区间[a,b],通过判断两端点函数值的符号,进⼀步缩⼩有限区间,将有根区间的长度缩⼩到充分⼩,从⽽,求得满⾜精度要求的根的近似值。

(3)不动点迭代法基本思想:已知⼀个近似根,构造⼀个递推关系(迭代格式),使⽤这个迭代格式反复校正根的近似值,计算出⽅程的⼀个根的近似值序列,使之逐步精确法,直到满⾜精度要求(该序列收敛于⽅程的根)。

实验步骤(1)⼆分法算法与MATLAB程序(⼆分法的依据是根的存在性定理,更深地说是介值定理)。

MATLAB程序,1 %⼆分法2 %输⼊:f(x)=0的f(x),[a,b]的a,b,精度ep3 %输出:近似根root,迭代次数k4 function [root,k]=bisect(fun,a,b,ep)5if nargin>36 elseif nargin<47 ep=1e-5;%默认精度8else9 error('输⼊参数不⾜');%输⼊参数必须包括f(x)和[a,b]10 end11if fun(a)*fun(b)>0%输⼊的区间要求12 root=[fun(a),fun(b)];13 k=0;14return;15 end16 k=1;17while abs(b-a)/2>ep%精度要求18 mid=(a+b)/2;%中点19if fun(a)*fun(mid)<020 b=mid;21 elseif fun(a)*fun(mid)>022 a=mid;23else24 a=mid;b=mid;25 end26 k=k+1;27 end28 root=(a+b)/2;29 end⼆分法1运⾏⽰例(并未对输出格式做控制,由于精度要求,事后有必要控制输出的精度):优化代码,减⼩迭代次数(在迭代前,先搜寻更适合的有根区间)1 %⼆分法改良2 %在⼀开始给定的区间中寻找更⼩的有根区间3 %输⼊:f(x)=0的f(x),[a,b]的a,b,精度ep4 %输出:近似根root,迭代次数k5 %得到的根是优化区间⾥的最⼤根6 function [root,k]=bisect3(fun,a,b,ep)7if nargin>38 elseif nargin<49 ep=1e-5;%默认精度10else11 error('输⼊参数不⾜');%输⼊参数必须包括f(x)和[a,b]12 end13 %定义划分区间的分数14 divQJ=1000;15 %等分区间16 tX=linspace(a,b,divQJ);17 %计算函数值18 tY=fun(tX);19 %找到函数值的正负变化的位置20 locM=find(tY<0);21 locP=find(tY>0);22 %定义新区间23if tY(1)<024 a=tX(locM(end));25 b=tX(locP(1));26else27 a=tX(locP(end));28 b=tX(locM(1));29 end30if fun(a)*fun(b)>0%输⼊的区间要求31 root=[fun(a),fun(b)];32 k=0;33return;34 end35 k=1;36while abs(b-a)/2>ep%精度要求37 mid=(a+b)/2;%中点38if fun(a)*fun(mid)<039 b=mid;40 elseif fun(a)*fun(mid)>041 a=mid;42else43 a=mid;b=mid;44 end45 k=k+1;46 end47 root=(a+b)/2;48 end⼆分法2运⾏⽰例(同样没有控制输出)明显地,迭代次数减⼩许多。

第二章非线性方程(组)的数值解法的matlab程序

第二章非线性方程(组)的数值解法的matlab程序

本章主要介绍方程根的有关概念,求方程根的步骤,确定根的初始近似值的方法(作图法,逐步搜索法等),求根的方法(二分法,迭代法,牛顿法,割线法,米勒(M üller )法和迭代法的加速等)及其MATLAB 程序,求解非线性方程组的方法及其MATLAB 程序.2.1 方程(组)的根及其MATLAB 命令2.1.2 求解方程(组)的solve 命令求方程f (x )=q (x )的根可以用MATLAB 命令:>> x=solve('方程f(x)=q(x)',’待求符号变量x ’)求方程组f i (x 1,…,x n )=q i (x 1,…,x n ) (i =1,2,…,n )的根可以用MATLAB 命令:>>E1=sym('方程f1(x1,…,xn)=q1(x1,…,xn)'); ……………………………………………………. En=sym('方程fn(x1,…,xn)=qn(x1,…,xn)'); [x1,x2,…,xn]=solve(E1,E2,…,En, x1,…,xn)2.1.3 求解多项式方程(组)的roots 命令如果)(x f 为多项式,则可分别用如下命令求方程0)(=x f 的根,或求导数)('x f (见表 2-1).2.1.4 求解方程(组)的fsolve 命令如果非线性方程(组)是多项式形式,求这样方程(组)的数值解可以直接调用上面已经介绍过的roots 命令.如果非线性方程(组)是含有超越函数,则无法使用roots 命令,需要调用MATLAB 系统中提供的另一个程序fsolve 来求解.当然,程序fsolve 也可以用于多项式方程(组),但是它的计算量明显比roots 命令的大.fsolve 命令使用最小二乘法(least squares method )解非线性方程(组)(F X =)0的数值解,其中X 和F (X )可以是向量或矩阵.此种方法需要尝试着输入解X 的初始值(向量或矩阵)X 0,即使程序中的迭代序列收敛,也不一定收敛到(F X =)0的根(见例2.1.8).fsolve 的调用格式: X=fsolve(F,X0)输入函数)(x F 的M 文件名和解X 的初始值(向量或矩阵)X 0,尝试着解方程(组)(F X =)0,运行后输出(F X =)0解的估计值(向量或矩阵)X .要了解更多的调用格式和功能请输入:help fsolve ,查看说明.2.2 搜索根的方法及其MATLAB 程序求解非线性方程根的近似值时,首先需要判断方程有没有根?如果有根,有几个根?如果有根,需要搜索根所在的区间或确定根的初始近似值(简称初始值).搜索根的近似位置的常用方法有三种:作图法、逐步搜索法和二分法等,使用这些方法的前提是高等数学中的零点定理.2.2.1 作图法及其MATLAB 程序作函数的图形的方法很多,如用计算机软件的图形功能画图,或用高等数学中应用导数作图,或用初等数学的函数叠加法作图等.下面介绍两种作图程序.作函数)(x f y =在区间 [a,b ] 的图形的MATLAB 程序一x=a:h:b; % h 是步长 y=f(x); plot(x,y) grid, gtext('y=f(x)')说明:⑴ 此程序在MATLAB 的工作区输入,运行后即可出现函数)(x f y =的图形.此图形与x 轴交点的横坐标即为所要求的根的近似值.⑵ 区间[a,b ] 的两个端点的距离 b-a 和步长h 的绝对值越小,图形越精确. 作函数)(x f y =在区间 [a,b ]上的图形的MATLAB 程序二 将)(x f y =化为)()(x g x h =,其中)()(x g x h 和是两个相等的简单函数x=a:h:b; y1=h(x); y2=g(x); plot(x, y1, x, y2)grid,gtext(' y1=h(x),y2=g(x)') 说明:此程序在MATLAB 的工作区输入,运行后即可出现函数)()(21x g y x h y ==和的图形.两图形交点的横坐标即为所要求的根的近似值.下面举例说明如何用计算机软件MATLAB 的图形功能作图.2.2.2 逐步搜索法及其MATLAB 程序逐步搜索法也称试算法.它是求方程0)(=x f 根的近似值位置的一种常用的方法. 逐步搜索法依赖于寻找连续函数)(x f 满足)(a f 与)(b f 异号的区间],[b a .一旦找到区间,无论区间多大,通过某种方法总会找到一个根.MATLAB 的库函数中没有逐步搜索法的程序,现提供根据逐步搜索法的计算步骤和它的% 输入的量--- a 和b 是闭区间[a,b]的左、右端点; %---h 是步长;%---tol 是预先给定的精度.% 运行后输出的量---k 是搜索点的个数;% --- r 是方程 在[a,b]上的实根的近似值,其精度是tol ; X=a:h:b;Y=funs(X);n=(b-a)/h+1;m=0; X(n+1)=X(n);Y(n+1)=Y(n); for k=2:nX(k)=a+k*h;Y(k)=funs(X(k)); %程序中调用的funs.m 为函数sk=Y(k)*Y(k-1); if sk<=0,m=m+1;r(m)=X(k); endxielv=(Y(k+1)-Y(k))*(Y(k)-Y(k-1)); if (abs(Y(k))<tol)&( xielv<=0) m=m+1;r(m)=X(k); end end例2.2.4 用逐步搜索法的MATLAB 程序分别求方程0332223=--+x xx 和0)2sin(cos 3=x 在区间]2,2[-上的根的近似值,要求精度是0.000 1.解 在MATLAB 工作窗口输入如下程序>> [k,r]=zhubuss(-2,2,0.001,0.0001)运行后输出的结果k =4001r = -1.2240 -1.0000 -1.0000 -0.9990 1.2250即搜索点的个数为k =4 001,其中有5个是方程⑴的近似根,即r = -1.224 0,-1.000 0,-1.000 0,-0.999 0,1.225 0,其精度为0.000 1.在程序中将y =2.*x .^3+2.*x .^2-3.*x -3用y =sin(cos(2.*x .^3)) 代替,可得到方程⑵在区间]2,2[-上的根的近似值如下r = -1.9190 -1.7640 -1.5770 -1.3300 -0.9220 0.9230 1.33101.5780 1.7650 1.9200如果读者分别将方程⑴的结果与例2.2.3比较,方程⑵的结果与例2.1.2比较,将会发现逐步搜索法的MATLAB 程序的优点.如果精度要求比较高,用这种逐步搜索法是不合算的.2.3 二分法及其MATLAB 程序2.3.1 二分法二分法也称逐次分半法.它的基本思想是:先确定方程0)(=x f 含根的区间(a,b ),再把区间逐次二等分.我们可以根据式(2.3b )、区间[a,b ]和误差ε,编写二分法求方程根的迭代次数的MATLAB2.3.2 二分法的MATLAB 程序二分法需自行编制程序,现提供用二分法求方程f (x )=0的根*x 的近似值k x 的步骤和式处的函数值.function [k,x,wuca,yx]=erfen(a,b,abtol) a(1)=a; b(1)=b;ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数 if ya* yb>0,disp('注意:ya*yb>0,请重新调整区间端点a 和b.'), return endmax1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil 是向∞+ 方向取整 for k=1: max1+1a;ya=fun(a); b;yb=fun(b); x=(a+b)/2; yx=fun(x); wuca=abs(b-a)/2; k=k-1; [k,a,b,x,wuca,ya,yb,yx] if yx==0a=x; b=x; elseif yb*yx>0b=x;yb=yx; elsea=x; ya=yx; endif b-a< abtol , return , end endk=max1; x; wuca; yx=fun(x);例2.3.3 确定方程x 3-x +4=0的实根的分布情况,并用二分法求在开区间 (-2,-1)内的实根的近似值,要求精度为0.001.解 (1)先用两种方法确定方程x 3-x +4=0 的实根的分布情况。

matlab解非线性方程

matlab解非线性方程

matlab解非线性方程MATLAB求解非线性方程一、Matlab求解非线性方程的原理1. 非线性方程是指当函数中的变量出现不同的次方数时,得出的方程就是非线性的。

求解非线性方程的准确性决定于得出的解集是否丰富,以及解的精度是否符合要求。

2. Matlab是一款多功能的软件,可以快速求解工程中的数学方程和模型,包括一元非线性方程。

Matlab 具有非线性解析计算能力,可以极大地提高求解效率。

二、Matlab求解非线性方程的方法1. 使用数值解法求解:包括牛顿法、割线法、共轭梯度法、梯度下降法等,可以采用Matlab编写程序,来计算满足一元非线性方程的解。

2. 使用符号解法求解:在Matlab中,可以直接使用solve函数来解决一元非线性方程。

3. Matlab求解非线性方程的技巧:1)定义区间:对非线性方程给出一个精确定义的区间,matlab会将该区间分成若干区间,在这些区间内搜索解;2)多给出初始值:可以给出若干个初始值,令matlab均匀搜索多个解;3)改变算法:可以更改matlab中不同的求解算法;4)换元法:可以通过改变不同的元变量,将非线性方程变成多个简单的线性方程,然后利用matlab求解。

三、Matlab求解非线性方程的特点1. 高效:Matlab求解的方式高效有效,性能优异,可以节省大量的求解时间。

2. 准确:Matlab采用符号解法时,解的准确度精度更高,可以满足大部分要求。

3. 节省资源:Matlab求解非线性方程节省计算机资源,可以很好地利用资源,提高工作效率。

四、 Matlab求解非线性方程的步骤1. 对结构表达式编写程序;2. 设定相应的条件;3. 优化程序;4. 运行程序;5. 分析结果;6. 测试代码;7. 验证学习结果。

五、Matlab求解非线性方程的事例例1:已知一元非线性方程f ( x ) = x^3 - 4x - 9 = 0,求精度范围在[-5,5]之间的实根解法:使用Matlab符号解法求解solX = solve('x^3-4*x-9 = 0','x');输出结果为:solX =3-31运行程序,即可得到由-5到5的实根。

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

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

matlab实现牛顿迭代法求解非线性方程组已知非线性方程组如下3*x1-cos(x2*x3)-1/2=0x1^2-81*(x2+0.1)^2+sin(x3)+1.06=0exp(-x1*x2)+20*x3+(10*pi-3)/3=0求解要求精度达到0.00001 ————————————————————————————————首先建立函数fun储存方程组编程如下将fun.m保存到工作路径中:function f=fun(x);%定义非线性方程组如下%变量x1 x2 x3%函数f1 f2 f3syms x1 x2 x3f1=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);endif norm(x-x0)<epscon=1;break;endx0=x;end%以下是将迭代过程写入txt文档文件名为iteration.txtfid=fopen('iteration.txt','w');fprintf(fid,'iteration');for j=1:length(x0)fprintf(fid,' x%d',j);endfor j=1:ifprintf(fid,'\n%6d ',j);for k=1:length(x0)fprintf(fid,' %10.6f',il(j,k));endendif con==1fprintf(fid,'\n计算结果收敛!');endif con==0fprintf(fid,'\n迭代步数过多可能不收敛!');endfclose(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%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0); %迭代公式tol=norm(r-x0); %注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendx0=[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.mfunction[r,n,data]=budong(x0, tol)if nargin=-1tol=1e-3:endx1=budong fun(x0);n=1;while(norm(x1-x0))tol)&(n500)x0=x1;x1=budong_fun(x0);n=n+1:data(:,n)=x1;endr=x1:new_ton.mfunction [x,n,data]=new_ton(x0, tol)if nargin=-1tol=1e-8;endx1=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;endx=x1;budong_fun.mfunction 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.mfunction 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求解非线性方程
例求f(x)=x-10x+2=0在x0=0.5附近的根。
步骤如下:
(1)建立函数文件funx.m。
function fx=funx(x)
fx=x-10.^x&##39;funx',0.5)
z =
0.3758
**非线性方程组的求解
对于非线性方程组F(X)=0,用fsolve函数求其数值解。fsolve函数的调用格式为:
If FUN is parameterized, you can use anonymous functions to capture the
problem-dependent parameters. Suppose you want to solve the system of
nonlinear equations given in the function myfun, which is parameterized
X=fsolve('fun',X0,option)
其中X为返回的解,fun是用于定义需求解的非线性方程组的函数文件名,X0是求根过程的初值,option为最优化工具箱的选项设定。最优化工具箱提供了20多个选项,用户可以使用optimset命令将它们显示出来。如果想改变其中某个选项,则可以调用optimset()函数来完成。例如,Display选项决定函数调用时中间结果的显示方式,其中‘off’为不显示,‘iter’表示每步都显示,‘final’只显示最终结果。optimset(‘Display’,‘off’)将设定Display选项为‘off’。
-.283
-2.987
y =
1.834-3.301*i
1.834+3.301*i
-.3600

MATLAB应用 求解非线性方程

MATLAB应用 求解非线性方程

第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x)1-n 1-n 1n 0,是n+1项之和 在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算 设有两个多项式na +⋯⋯++=x a x a x a p1(x)1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x)1-m 1-m 1m 0。

它们的加减运算实际上就是它们的对应系数的加减运算。

当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。

当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。

例2 计算()()1635223-+++-x x x xa=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例 3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐f+g1, f-g1三、多项式的乘法运算conv(p1,p2)例4 在上例中,求f(x)*g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。

Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; [Q, r]=deconv(f, g) 五、多项式的导函数p=polyder(P):求多项式P 的导函数 p=polyder(P,Q):求P ·Q 的导函数[p,q]=polyder(P,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。

matlab代码--非线性方程组求解

matlab代码--非线性方程组求解

非线性方程组求解1.mulStablePoint用不动点迭代法求非线性方程组的一个根function [r,n]=mulStablePoint(F,x0,eps)%非线性方程组:f%初始解:a%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-6;endx0 = transpose(x0);n=1;tol=1;while tol>epsr= subs(F,findsym(F),x0); %迭代公式tol=norm(r-x0); %注意矩阵的误差求法,norm为矩阵的欧几里德范数n=n+1;x0=r;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend2.mulNewton用牛顿法法求非线性方程组的一个根function [r,n]=mulNewton(F,x0,eps)if nargin==2eps=1.0e-4;endx0 = transpose(x0);Fx = subs(F,findsym(F),x0);var = findsym(F);dF = Jacobian(F,var);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx;n=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);r=x0-inv(dFx)*Fx; %核心迭代公式tol=norm(r-x0);n=n+1;if(n>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend3.mulDiscNewton用离散牛顿法法求非线性方程组的一个根function [r,m]=mulDiscNewton(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=transpose(x0)-inv(J)*fx;m=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;4.mulMix用牛顿-雅可比迭代法求非线性方程组的一个根function [r,m]=mulMix(F,x0,h,l,eps)if nargin==4eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = transpose(x0)-dr; m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));C =D - J;inD = inv(D);H = inD*C;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend5.mulNewtonSOR用牛顿-SOR迭代法求非线性方程组的一个根function [r,m]=mulNewtonSOR(F,x0,w,h,l,eps)if nargin==5eps=1.0e-4;endn = length(x0);J = zeros(n,n);Fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = transpose(x0)-dr;m=1;tol=1;while tol>epsx0=r;Fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endD = diag(diag(J));L = -tril(J-D);U = -triu(J-D);inD = inv(D-w*L);H = inD*(D - w*D+w*L);;Hm = eye(n,n);for i=1:l-1Hm = Hm + power(H,i);enddr = w*Hm*inD*Fx;r = x0-dr; %核心迭代公式tol=norm(r-x0);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endend6.mulDNewton用牛顿下山法求非线性方程组的一个根function [r,m]=mulDNewton(F,x0,eps)%非线性方程组:F%初始解:x0%解的精度:eps%求得的一组解:r%迭代步数:nif nargin==2eps=1.0e-4;endx0 = transpose(x0);dF = Jacobian(F);m=1;tol=1;while tol>epsttol=1;w=1;Fx = subs(F,findsym(F),x0);dFx = subs(dF,findsym(dF),x0);F1=norm(Fx);while ttol>=0 %下面的循环是选取下山因子w的过程r=x0-w*inv(dFx)*Fx; %核心的迭代公式Fr = subs(F,findsym(F),r);ttol=norm(Fr)-F1;w=w/2;endtol=norm(r-x0);m=m+1;x0=r;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endend7.mulGXF1用两点割线法的第一种形式求非线性方程组的一个根function [r,m]=mulGXF1(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(x1);n = length(x0);fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = x1;x1 = r;fx = subs(F,findsym(F),x0);fx1 = subs(F,findsym(F),x1);h = x0 - x1;J = zeros(n,n);for i=1:nxt = x1;xt(i) = x0(i);J(:,i) = (subs(F,findsym(F),xt)-fx1)/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;8.mulGXF2用两点割线法的第二种形式求非线性方程组的一个根function [r,m]=mulGXF2(F,x0,x1,eps)format long;if nargin==3eps=1.0e-4;endx0 = transpose(x0);x1 = transpose(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)-subs(F,findsym(F),x1))/h(1);for i=2:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;m=1;tol=1;while tol>epsx0 = 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:nxt = x1;xt(1:i) = x0(1:i);xt_m = x1;xt_m(1:i-1) = x0(1:i-1);J(:,i) = (subs(F,findsym(F),xt)-subs(F,findsym(F),xt_m))/h(i);endr=x1-inv(J)*fx1;tol=norm(r-x1);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;9.mulVNewton用拟牛顿法求非线性方程组的一组解function [r,m]=mulVNewton(F,x0,A,eps)%方程组:F%方程组的初始解:x0% 初始A矩阵:A%解的精度:eps%求得的一组解:r%迭代步数:mif nargin==2A=eye(length(x0)); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendx0 = transpose(x0);Fx = subs(F, findsym(F),x0);r=x0-A\Fx;m=1;tol=1;while tol>epsx0=r;Fx = subs(F, findsym(F),x0);r=x0-A\Fx;y=r-x0;Fr = subs(F, findsym(F),r);z= Fr-Fx;A1=A+(z-A*y)*transpose(y)/norm(y); %调整A A=A1;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end10.mulRank1用对称秩1算法求非线性方程组的一个根function [r,n]=mulRank1(F,x0,A,eps)if nargin==2l = length(x0);A=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-inv(A)*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-inv(A)*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;A1=A+ fr *transpose(fr)/(transpose(fr)*y); %调整A A=A1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end11.mulDFP用D-F-P算法求非线性方程组的一组解function [r,n]=mulDFP(F,x0,A,eps)if nargin==2l = length(x0);B=eye(l); %A取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;B1=B+ y*y'/(y'*z)-B*z*z'*B/(z'*B*z); %调整AB=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end12.mulBFS用B-F-S算法求非线性方程组的一个根function [r,n]=mulBFS(F,x0,B,eps)if nargin==2l = length(x0);B=eye(l); %B取为单位阵eps=1.0e-4;elseif nargin==3eps=1.0e-4;endendfx = subs(F,findsym(F),x0);r=transpose(x0)-B*fx;n=1;tol=1;while tol>epsx0=r;fx = subs(F,findsym(F),x0);r=x0-B*fx;y=r-x0;fr = subs(F,findsym(F),r);z = fr-fx;u = 1 + z'*B*z/(y'*z);B1= B+ (u*y*y'-B*z*y'-y*z'*B)/(y'*z); %调整B B=B1;n=n+1;if(n>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endtol=norm(r-x0);end13.mulNumYT用数值延拓法求非线性方程组的一组解function [r,m]=mulNumYT(F,x0,h,N,eps)format long;if nargin==4eps=1.0e-8;endn = length(x0);fx0 = subs(F,findsym(F),x0);x0 = transpose(x0);J = zeros(n,n);for k=0:N-1fx = subs(F,findsym(F),x0);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endinJ = inv(J);r=x0-inJ*(fx-(1-k/N)*fx0);x0 = r;endm=1;tol=1;while tol>epsxs=r;fx = subs(F,findsym(F),xs);J = zeros(n,n);for i=1:nx1 = xs;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-fx)/h(i);endr=xs-inv(J)*fx; %核心迭代公式tol=norm(r-xs);m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;14.DiffParam1用参数微分法中的欧拉法求非线性方程组的一组解function r=DiffParam1(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);for k=1:NFx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h(i);J(:,i) = (subs(F,findsym(F),x1)-Fx)/h(i);endinJ = inv(J);r = x0 - ht*inJ*Fx0;x0 = r;end15.DiffParam2用参数微分法中的中点积分法求非线性方程组的一组解function r=DiffParam2(F,x0,h,N)%非线性方程组:f%初始解:x0%数值微分增量步大小:h%雅可比迭代参量:l%解的精度:eps%求得的一组解:r%迭代步数:nx0 = transpose(x0);n = length(x0);ht = 1/N;Fx0 = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nxt = x0;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx0)/h(i);endinJ = inv(J);x1 = x0 - ht*inJ*Fx0;for k=1:Nx2 = x1 + (x1-x0)/2;Fx2 = subs(F,findsym(F),x2);J = zeros(n,n);for i=1:nxt = x2;xt(i) = xt(i)+h(i);J(:,i) = (subs(F,findsym(F),xt)-Fx2)/h(i);endinJ = inv(J);r = x1 - ht*inJ*Fx0;x0 = x1;x1 = r;end16.mulFastDown用最速下降法求非线性方程组的一组解function [r,m]=mulFastDown(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0-J*lamda; %核心迭代公式fr = subs(F,findsym(F),r);tol=dot(fr,fr);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;17.mulGSND用高斯牛顿法求非线性方程组的一组解function [r,m]=mulGSND(F,x0,h,eps)format long;if nargin==3eps=1.0e-8;endn = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endDF = inv(transpose(J)*J)*transpose(J);r=x0-DF*fx; %核心迭代公式tol=norm(r-x0);x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;18.mulConj用共轭梯度法求非线性方程组的一组解function [r,m]=mulConj(F,x0,h,eps)format long;if nargin==3eps=1.0e-6;endn = length(x0);x0 = transpose(x0);fx0 = subs(F,findsym(F),x0);p0 = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)*(1+h);p0(:,i) = -(subs(F,findsym(F),x1)-fx0)/h;endm=1;tol=1;while tol>epsfx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;J(:,i) = (subs(F,findsym(F),x1)-fx)/h;endlamda = fx/sum(diag(transpose(J)*J));r=x0+p0*lamda; %核心迭代公式fr = subs(F,findsym(F),r);Jnext = zeros(n,n);for i=1:nx1 = r;x1(i) = x1(i)+h;Jnext(:,i) = (subs(F,findsym(F),x1)-fr)/h;endabs1 = transpose(Jnext)*Jnext;abs2 = transpose(J)*J;v = abs1/abs2;if (abs(det(v)) < 1)p1 = -Jnext+p0*v;elsep1 = -Jnext;endtol=norm(r-x0);p0 = p1;x0 = r;m=m+1;if(m>100000) %迭代步数控制 disp('迭代步数太多,可能不收敛!');return;endendformat short;19.mulDamp用阻尼最小二乘法求非线性方程组的一组解function [r,m]=mulDamp(F,x0,h,u,v,eps)format long;if nargin==5eps=1.0e-6;endFI = transpose(F)*F/2;n = length(x0);x0 = transpose(x0);m=1;tol=1;while tol>epsj = 0;fx = subs(F,findsym(F),x0);J = zeros(n,n);for i=1:nx1 = x0;x1(i) = x1(i)+h;afx = subs(F,findsym(F),x1);J(:,i) = (afx-fx)/h;endFIx = subs(FI,findsym(FI),x0);for i=1:nx2 = x0;x2(i) = x2(i)+h;gradFI(i,1) = (subs(FI,findsym(FI),x2)-FIx)/h;ends=0;while s==0A = transpose(J)*J+u*eye(n,n);p = -A\gradFI;r = x0 + p;FIr = subs(FI,findsym(FI),r);if FIr<FIxif j == 0u = u/v;j = 1;elses=1;endelseu = u*v;j = 1;if norm(r-x0)<epss=1;endendendx0 = r;tol = norm(p);m=m+1;if(m>100000) %迭代步数控制disp('迭代步数太多,可能不收敛!');return;endendformat short;。

第二次实验报告(非线性方程求根)

第二次实验报告(非线性方程求根)

班级: 学号: 姓名: 成绩:实验2 非线性方程的数值解法实验1实验目的1)进一步熟练掌握求解非线性方程的牛顿迭代法和弦截法。

2)根据牛顿迭代法和弦截法的原理,编写程序求解非线性方程,提高编程解决问题的能力。

2 实验内容(1)用牛顿法和割线法求下列方程的根x^2-e^x=0;x*e^x-1=0;(23实验原理(1)牛顿迭代公式:1()/'()k k k k x x f x f x +=- 双点弦法公式:111()()()()k k k k k k k f x x x x x f x f x +--=--- (2)令2()f x x A =-,再用牛顿法求根。

4实验步骤1)根据牛顿迭代法,双点弦法的算法编写相应的求根函数;2)用牛顿迭代法和双点弦法分别对方程进行求解;5 程序设计牛顿迭代法x0=1.0;N=100;k=0;eps=5e-6;delta=1e-6;while(1)x1=x0-fc1(x0)/fc2(x0);k=k+1;if k>Ndisp('Newton method failed')breakendif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endx0=x1;endfprintf('%f',x0)fprintf('%f',abs(fc1(x1)))双点弦法function cutline(x0,x1)N=100;k=0;delta=5e-8;while(1)(abs(x1-x0)>=delta)c=x1;x1=cutnext(x0,x1);x0=c;k=k+1;if k>Ndisp('Cutline method failed')break;endif(abs(x1-x0)<delta || abs(fc1(x1))<delta) break;endendfprintf('%10f\n',x1);function y=cutnext(a,b)y=b-fc(b)/(fc(b)-fc(a))*(b-a);1)原函数function fc1=fc1(x)fc1=x^2-exp(x);end导函数function fc2=fc2(x)fc2=2*x-exp(x);end2)原函数导函数3)原函数导函数6实验结果及分析注:牛顿迭代法由于设置delta=1e-6,所以算出的误差e<1.0*10^-6;割线法由于设置delta=5e-8,所以误差e<5.0*10^-8.7总结。

第4章 MATLAB 非线性方程(组)的求解实例解析

第4章 MATLAB 非线性方程(组)的求解实例解析
e x sin 2 y − 2 y 2 − 1 = 0 cos 2 x + y sin x = 0
• 同【例4-10】,利用鼠标取点进行每个零点的求解。编写程序 example_4_13.m,运行得到如下结果。
sin(2*y)*exp(x)-2*y 2-1 cos(2*x)+y*sin(x) 6
问题转化为求上述方程组的根,编写程序exercise_4_5.m。
【练3】编写如下程序:
• • • • • • x=0; y=0; for i=1:29999 x(i+1)=1+y(i)-1.4*x(i)^2; y(i+1)=0.3*x(i); end 0.4 plot(x,y,'.')
0.3 0.2 0.1 0 -0.1 -0.2 -0.3 -0.4 -1.5
-1.5
-1
-0.5
0
0.5
1
1.5
2
【例4-4】牛顿法求根。
• 分别利用牛顿法和牛顿法重根情形求解下面多项式方程在2附近的根。
x4 − 231 3 17901 2 579501 6762366 x + x − x+ =0 25 625 15625 390625
牛顿型求根方法比较
5 4 3 2 1
4
2
0
y
example_4_13.m
-2
-4
-6
0
1
2
3 x
4
5
6
7
实验范例:购房付款问题
• 假设一栋房子售价A元,买家首付A0 ( A0 ≤ A),其余的分m个月付款,每 月末需付b元,试计算该分期付款的年利率。 • 解:设月利率为r,为使m个月后还清贷款,则第一个月后还款总额 为A0 (1 + r ) + b ,第二个月后还款总额为A0 (1 + r ) 2 + b(1 + r ) + b ,以此类推,第 m个月后还款总额为:

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;endmax1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<deltabreak;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');endfor k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilonbreak;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。

MATLAB实例:非线性方程数值解法(迭代解)

MATLAB实例:非线性方程数值解法(迭代解)

MATLAB实例:⾮线性⽅程数值解法(迭代解)MATLAB实例:⾮线性⽅程数值解法(迭代解)很久之前写过⼀篇关于“”,本博⽂相当于之前这⼀篇的延续与拓展,介绍四种求解⼀元⾮线性⽅程的数值解法(迭代解),包括:⽜顿迭代法,Halley迭代法,Householder迭代法以及预测校正⽜顿-哈雷迭代法(Predictor-Corrector Newton-Halley,PCNH),具体参考⽂献[1],来源于这篇⽂章:THREE-STEP ITERATIVE METHOD WITH EIGHTEENTH ORDER CONVERGENCE FOR SOLVING NONLINEAR EQUATIONS。

1. 迭代更新公式2. MATLAB程序newton.mfunction [x1, k]=newton(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);halley.mfunction [x1, k]=halley(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-(2*subs(fun,x,t0)*subs(diff(fun,'x'), x, t0))/(2*(subs(diff(fun,'x'), x, t0))^2-subs(fun, x, t0)*subs(diff(fun,'x',2),x,t0)); if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);householder.mfunction [x1, k]=householder(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;t1=t0-(subs(fun, x, t0))/(subs(diff(fun,'x'),x,t0))-(((subs(fun, x, t0))^2)*subs(diff(fun,'x',2),x,t0))/(2*(subs(diff(fun,'x',2),x,t0))^3); if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);PCNH.mfunction [x1, k]=PCNH(t1,esp,m)syms x;fun=x^3+4*(x^2)-10;for k=1:mif abs(subs(diff(fun,'x'),x,t1))<espx1=t1;break;elseif subs(diff(fun,'x',2),x,t1)==0break;disp('解题失败!')elset0=t1;w=t0-subs(fun,x,t0)/subs(diff(fun,'x'),x,t0);y=w-(2*subs(fun,x,w)*subs(diff(fun,'x'), x, w))/(2*(subs(diff(fun,'x'), x, w))^2-subs(fun, x, w)*subs(diff(fun,'x',2),x,w)); t1=y-(subs(fun, x, y))/(subs(diff(fun,'x'),x,y))-(((subs(fun, x, y))^2)*subs(diff(fun,'x',2),x,y))/(2*(subs(diff(fun,'x',2),x,y))^3);if abs(t1-t0)<espx1=t1;break;endendendend% x1=vpa(x1,15);demo.mclearclc% Input: 初始值,迭代终⽌条件,最⼤迭代次数[x1, k1]=newton(1,1e-4,20); % ⽜顿迭代法[x2, k2]=halley(1,1e-4,20); % Halley迭代法[x3, k3]=householder(1,1e-4,20); % Householder迭代法[x4, k4]=PCNH(1,1e-4,20); % 预测校正⽜顿-哈雷迭代法(PCNH)fprintf('⽜顿迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x1, k1);fprintf('Halley迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x2, k2);fprintf('Householder迭代法求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x3, k3);fprintf('预测校正⽜顿-哈雷迭代法(PCNH)求解得到的⽅程的根为:%.15f, 实际迭代次数为:%d次\n', x4, k4); %% 函数图像x=-5:0.01:5;y=x.^3+4.*(x.^2)-10;y_0=zeros(length(x));plot(x, y, 'r-', x, y_0, 'b-');xlabel('x');ylabel('f(x)');title('f(x)=x^3+4{x^2}-10');saveas(gcf,sprintf('函数图像.jpg'),'bmp'); %保存图⽚3. 数值结果求解$f(x)=x^3+4{x^2}-10=0$⽅程在$x_0=1$附近的根。

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)

数值分析中求解非线性方程的MATLAB求解程序(6种)数值分析中求解非线性方程的MATLAB求解程序(6种)1.求解不动点function [k,p,err,P]=fixpt(g,p0,tol,max1)%求解方程x=g(x) 的近似值,初始值为p0%迭代式为Pn+1=g(Pn)%迭代条件为:在迭代范围内满足|k|<1(根及附近且包含初值)k为斜率P(1)=p0;for k=2:max1P(k)=feval(g,P(k-1));err=abs(P(k)-P(k-1));relerr=err/(abs(P(k))+eps);p=P(k);if (err<tol)|(relerr<tol)< p="">break;endendif k==max1disp('超过了最长的迭代次数')endP=P';2.二分法function [c,err,yc]=bisect(f,a,b,delta)%二分法求解非线性方程ya=feval(f,a);yb=feval(f,b);if ya*yb>0break;max1=1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;endif b-a<delta< p="">break;endendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);3.试值法function [c,err,yc]=regula(f,a,b,delta,epsilon,max1) %试值法求解非线性方程%f(a)和飞(b)异号ya=feval(f,a);yb=feval(f,b);if ya*yb>0disp('Note:f(a)*f(b)>0');for k=1:max1dx=yb*(b-a)/(yb-ya);c=b-dx;ac=c-a;yc=feval(f,c);if yc==0break;elseif yb*yc>0b=c;yb=yc;elsea=c;ya=yc;enddx=min(abs(dx),ac);if abs(dx)<delta|abs(yc)<epsilon< p="">break;endendc;err=abs(b-a)/2;yc=feval(f,c);4.求解非线性方程根的近似位置function R=approot(X,epsilon)%求解根近似位置%为了粗估算方程f(x)=0在区间[a,b]的根的位置,%使用等间隔采样点(xk,f(xk))和如下的评定准则:%f(xk-1)与f(xk)符号相反,%或者|f(xk)|足够小且曲线y=f(x)的斜率在%(xk,f(xk))附近改变符号。

matlab非线性方程的解法(含牛拉解法)

matlab非线性方程的解法(含牛拉解法)

非线性方程的解法(含牛拉解法)1引 言数学物理中的许多问题归结为解函数方程的问题,即,0)(=x f (1.1) 这里,)(x f 可以是代数多项式,也可以是超越函数。

若有数*x 为方程0)(=x f 的根,或称函数)(x f 的零点。

设函数)(x f 在],[b a 内连续,且0)()(<b f a f .根据连续函数的性质知道,方程0)(=x f 在区间],[b a 内至少有一个实根;我们又知道,方程0)(=x f 的根,除了极少简单方程的根可以用解析式表达外,一般方程的根很难用一个式子表达。

即使能表示成解析式的,往往也很复杂,不便计算。

所以,具体求根时,一般先寻求根的某一个初始近似值,然后再将初始近似值逐步加工成满足精度要求为止.如何寻求根的初始值呢?简单述之,为了明确起见,不妨设)(x f 在区间],[b a 内有一个实的单根,且0)(,0)(><b f a f .我们从左端出点a x =0出发,按某一预定的步长h 一步一步地向右跨,每跨一步进行一次根的“搜索”,即检查每一步的起点k x 和1+k x (即,h x k +)的函数值是否同号。

若有:0)(*)(≤+h x f x f k k (1.2) 那么所求的根必在),(h x x k k +内,这时可取k x 或h x k +作为根的初始近似值。

这种方法通常称为“定步长搜索法"。

另外,还是图解法、近似方程法和解析法。

2 迭代法2。

1 迭代法的一般概念迭代法是数值计算中一类典型方法,不仅用于方程求根,而且用于方程组求解,矩阵求特征值等方面。

迭代法的基本思想是一种逐次逼近的方法。

首先取一个精糙的近似值,然后用同一个递推公式,反复校正这个初值,直到满足预先给定的精度要求为止。

对于迭代法,一般需要讨论的基本问题是:迭代法的构造、迭代序列的收敛性天收敛速度以及误差估计。

这里,主要看看解方程迭代式的构造。

对方程(1。

MATLABNewton迭代法解非线性方程

MATLABNewton迭代法解非线性方程

MATLABNewton迭代法解非线性方程Newton 迭代法解非线性方程Newton 迭代法解非线性方程算法:Step 1 给定初值0x ,e 为根的容许误差Step 2 计算()()1'11----=n n n n x f x f x xStep 3 判断e x x <-0转到Step 4否则转到Step 2Step 4 迭代结果为n x x =Newton 迭代法解非线性方程程序:function Newton_diedai(fun,x0,e)%fun--原函数%dfun-导函数%x0---迭代初值%e----精度%k----迭代次数dfun=inline(diff('x^3-x^2-1'));%计算导函数x=x0;x0=x+1000*e;k=0;while abs(x0-x)>e&k<100%判断误差和迭代次数k=k+1;%计算迭代次数x0=x;x=x0-feval(fun,x0)/feval(dfun,x0);endif k==500disp('迭代次数过多,防止死循环终止');elsefprintf('迭代到%d 次时得到结果%f\n',k,x)end例:用Newton 迭代法求解非线性方程0123=--x x 在5.10=x 附近的根输入:clear allclcfun=inline('x^3-x^2-1')Newton_diedai(fun,1.5,0.5e-6)得到:迭代到4次时得到结果1.465571指导教师:***。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

湖北民族学院《数值分析》实验报告实验名称 解非线性方程的数值计算方法 实验时间 2011年 11月 9日 姓名王亚敏班级0209408学号020940807成绩实验报告内容要求:一、实验目的与要求;二、实验内容;三、算法描述(数学原理或设计思路、计算公式、计算步骤); 四、程序代码;五、数值结果;六、计算结果分析(如初值对结果的影响;不同方法的比较;该方法的特点和改进等);七、实验中出现的问题,解决方法及体会(整个实验过程中(包括程序编写,上机调试等)出现的问题及其处理等广泛的问题).一、实验目的:① 掌握二分法、不动点迭代法、牛顿迭代法、Steffensen 迭代法等常用的非线性方程迭代算法; ② 培养编程与上机调试能力. 二、实验内容:1.请分别用二分法、不动点迭代法、牛顿迭代法、Steffensen 迭代法求方程32()330f x x x x =+--=在1.5 附近的根.参考答案:原方程在1.5 附近的根为1.732051x =2.请自选两个非线性方程,分别用二分法、不动点迭代法、牛顿迭代法、Steffensen 迭代法求解. 三、算法(一) 1.二分法计算()0f x =的二分法如下:① 输入求根取间[,]a b 和误差控制量ε,定义函数. 如果 ()()0f a f b <,转②;否则退出选用其它求根方法 ② 当a b ε->时,计算中点()/2x a b =+以及的值; 分情况处理()f x ε<:停止计算,,转④()()0f a f x <:修正区间[,][,]ax ab → ()()0f x f b <:修正区间[,][,]xb ab →③ *2a bx +=④ 输出近似根*x2.不动点(简单)迭代法算法思想先将f(x)=0化成x=φ(x),然后取x 0,计算x n+1=φ(x n ) n=0,1,2,…若要求x *满足f(x *)=0,则x *=)(*x ϕ,称x *为函数)(x ϕ的一个不动点。

求 f(x)的零点就等价于求ϕ(x )的不动点,选择一个初始近似值x 0,将它代入x=ϕ(x )右 端,即可求的)(01x x ϕ=可以如此反复迭代计算x n+1=φ(x n ),ϕ(x )称为迭代函数,如此得到的序列{x n }有极限*∞→=x x k k lim 则称迭代方程收敛,且x *=)(*x ϕ为)(x ϕ的不动点,故称x n+1=φ(x n )为不动点迭代法。

3.牛顿迭代法给定初始值x ,ε为根的容许误差,η为的容许误差,N 为迭代次数的容许值. ① 如果'0()0f x =或迭代次数大于N ,则算法失败,结束;否则执行② ② 计算010'0()()f x x x f x =-③ 若10x x ε-<或1()f x η<,则输出x ,程序结束;否则执行④ ④ 令01x x =,转向①4、Steffensen 迭代法如果把Aitken 加速技巧与不动点迭代结合,则可得到如下的迭代:kk k k k k k k k k k x y z x y x x y z x y +---===+2)(),(),(21ϕϕ (k=0,1,2,........)这称为Steffensen 迭代法.它是二阶收敛的.它让不收敛的收敛,即使是收敛的用Steffensen 后可达到二阶收敛.四、程序代码1、二分法function x=erfenfa(f,a,b,n,delta) f=inline(f); %定义f. yb=feval(f,b);disp('i x') %以指定格式输出'i','x' for i=1:nya=feval(f,a); %f 的在a 点的值给yb. s=(a+b)/2; %开始二分区间 c=feval(f,s); %计算 if c==0 %判断二分区间 breakelseif (c*ya)<0 b=s; else a=s; endif abs(b-a)<delta break enddisp(sprintf('%d %10e',i,s)) %以以上规定格式输出解果x=s;2、迭代法function y=diedaifa(f,x0,w,max)f=inline(f);disp('k y')disp(sprintf('%d %15.14f',0,x0))for k=1:maxy=feval(f,x0);if abs(y-x0)<wbreakendx0=y;disp(sprintf('%d %15.14f',k,y))endk3、牛顿迭代function y=newton_c(f,x0,w,max)f=inline(f);disp('k y')disp(sprintf('%d %15.14f',0,x0))for k=1:maxy=feval(f,x0);if abs(y-x0)<wbreakendx0=y;disp(sprintf('%d %15.14f',k,y))endk4、Steffensen迭代法function s=steff(f,x0,d,max)f=inline(f); %定义函数x(1)=x0; %给初值disp('k x y z'); %指定格式输出k,x,y,z for k=1:maxy(k)=feval(f,x(k)); %本函数在它指定的点的值z(k)=feval(f,y(k)); %本函数在它指定的点的值x(k+1)=x(k)-(y(k)-x(k))^2/(z(k)-2*y(k)+x(k)); %算法公式if abs(x(k+1)-x(k))<d %在计算条件中进行判断breakdisp(sprintf('%d %f %f %f',k,x(k),y(k),z(k))); %输出结果ends=x(k+1); %输出结果五、计算结果(一)1、二分法x=erfenfa('x^3+x^2-3*x-3',1.0,2.0,6,10^(-3))i x1 1.500000e+0002 1.750000e+0003 1.625000e+0004 1.687500e+0005 1.718750e+0006 1.734375e+000x =1.73442、迭代法y=diedaifa('(-x^2+3*x+3)^(1/3)',1.5, 10^(-6),9)k y0 1.500000000000001 1.738013322443222 1.731739333296883 1.732066858386414 1.73204997984982k =5y =1.73213、牛顿迭代y=newton_c('x-(x^3+x^2-3*x-3)/(3*x^2+2*x-3)',1.5, 10^(-6),9)k y0 1.500000000000001 1.777777777777782 1.733360666940003 1.732051929409474 1.73205080756970k =5y =1.73214、Steffensen迭代法s=steff('(-x^2+3*x+3)^(1/3)',1.5,10^(-6),15) k x y z1 1.500000 1.738013 1.7317392 1.731900 1.732059 1.732050 s =1.7321(二)方程x^3-x^2-11、二分法x=erfenfa('x^3-x^2-1',1.0,2.0,6,10^(-3))i x1 1.500000e+0002 1.250000e+0003 1.375000e+0004 1.437500e+0005 1.468750e+0006 1.453125e+000x =1.45312、不动点迭代y=diedaifa('(x^2+1)^(1/3)',1.5, 10^(-6),9)k y0 1.500000000000001 1.481248034203692 1.472705729639393 1.468817313664504 1.467047973200605 1.466243010114756 1.465876820168817 1.465710240775878 1.465634465238519 1.46559999585332k =9y =1.46563、牛顿迭代y=newton_c('x-(x^3-x^2-1)/(3*x^2-2*x)',1.5, 10^(-6),9) k y0 1.500000000000001 1.466666666666672 1.465572390572393 1.46557123187807k =4y =1.46564、Steffensen迭代法s=steff('(x^2+1)^(1/3)',1.5,10^(-6),15)k x y z1 1.500000 1.481248 1.4727062 1.465558 1.465565 1.465569s =1.4656(三)方程想x^3+4x^2-101、二分法x=erfenfa('x^3+4*x^2-10',1.0,2.0,6,10^(-3))i x1 1.500000e+0002 1.250000e+0003 1.375000e+0004 1.312500e+0005 1.343750e+0006 1.359375e+000x =1.35942、不动点迭代y=diedaifa('(1/2)*((10-x^3)^(1/2))',1.4, 10^(-6),9)k y0 1.400000000000001 1.346848172586652 1.374483304275453 1.360452145192084 1.367665374147665 1.363980405747056 1.365869029182217 1.364902669703748 1.365397550251579 1.36514422782316k =9y =1.36513、牛顿迭代y=newton_c('x-(x^3+4*(x^2)-10)/(3*x^2+8*x)',1.5, 10^(-6),9) k y0 1.500000000000001 1.373333333333332 1.365262014874633 1.36523001391615k =4y =1.36524、Steffensen迭代法s=steff('(1/2)*((10-x^3)^(1/2))',1.5,10^(-6),15)k x y z1 1.500000 1.286954 1.4025412 1.361886 1.366937 1.3643553 1.365228 1.365231 1.365230s =1.3652六、计算结果分析从计算结果可以看出,不动点迭代法、牛顿迭代法、Steffensen迭代法的结果都比二分法要精确。

相关文档
最新文档