Matlab 解非线性方程组2
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的解;X=B/A表示矩阵方程XA=B的解。
对方程组X=A\B,要求A和B用相同的行数,X和B有相同的列数,它的行数等于矩阵A的列数,方程X=B/A同理。
如果矩阵A不是方阵,其维数是m×n,则有:m=n 恰定方程,求解精确解;m>n 超定方程,寻求最小二乘解;m<n 不定方程,寻求基本解,其中至多有m个非零元素。
matlab求解非线性方程组及极值

matlab求解非线性方程组及极值默认分类2010-05-18 15:46:13 阅读1012 评论2 字号:大中小订阅一、概述:求函数零点和极值点:Matlab中三种表示函数的方法: 1. 定义一个m函数文件, 2.使用函数句柄; 3.定义inline函数, 其中第一个要掌握简单函数编写, 二, 三中掌握一个。
函数的'常规'使用有了函数了, 我们怎么用呢, 一种是直接利用函数来计算, 例如: sin(pi), 还有我们提到的mysqr(3)...另一种是函数画图, 例如Plottools中提到的ezplot, ezsurf... 但是这也太小儿科了, 有没有想过定义函数后, 利用它来: 求解零点(即解f(x)=0方程), 最优化(求最值/极值点), 求定积分, 常微分方程求解等. 当然这里由于篇幅有限(空间快满了)以及这个只是'基础教程'的缘故, 只提及一些皮毛知识, 掌握这些后, 如果需要你可以进一步学习.解f(x)=0已知函数求解函数值=0所表示的方程, Matlab中有两个函数可以做到, fzero和fsolve前者只能解一元方程, 后者可以解多元方程组, 不过基本使用形式上差不多:解=fzero(函数, 初值, options)解=fsolve(函数, 初值, options)关于解: fzero给出的是x单值的解, fsolve给出的是解x可能处于的区间, 当然, 这个区间很窄.关于'函数', 还记得前面提到的三种表示方法吧, 在这里都可以用, 记住就是: 如果直接使用函数名, 要用单引号将它括起来, 而函数句柄, inline函数可以直接使用.关于'初值': 电脑比较笨, 它寻找解的办法是尝试不同地x值, 摸索解在哪里, 所以我们一开始就要给它指明从哪里开始下手, 初值这里, 可以只给它一个值, 让它在这个值附近找解, 也可以给它一个区间(区间用[下限,上限]这种方式表示), 它会在这个区间内找解.fzero的一些局限, 如果你给定的初值是区间, 而恰好函数在区间端点处同号, fzero会出错, 而如果你只给一个初值, fezro又有可能'走错方向', 例如给初值2让它解mysqr这个函数方程就出错了, FT!寻找函数极值/最值Matlab中也有两个函数可以做到, 是: fminbnd: 寻找一元函数极小值; fminsearch: 寻找多元函数极小值(当然一元也行). 别问我怎么没有找极大值的Matlab函数, 你把原函数取负数, 寻找它的极小值不就行了. 相关语法:x=fminbnd(函数, 区间起始值, 区间终止值)x=fminsearch(函数, 自变量初值)相关说明: fminbnd中指定要查找极小值的自变量区间, 好像不指定也行, 不过那样的话, 如果函数有多个极小值就可能比较难以预料结果了.fminsearch中要给定一个初值, 这个初值可以是自变量向量(将自变量依次排在一起组成向量)的初值, 也可以是表示向量初值区间的一个矩阵.函数: 那三种形式都适用, 但是记住, 直接使用函数名称需要加单引号!cite from:/qq529312840/blog/item/3687e4c7e7e2d6d9d0006049.html二、实例+讲解(1)非线性方程数值求解:1 单变量非线性方程求解在MATLAB中提供了一个fzero函数,可以用来求单变量非线性方程的根。
MATLAB教学视频:非线性方程(组)在MATLAB中的求解方法

0.6
0.8
1 t
1.2
1.4
1.6
1.8
2
二元方程组的图解法
用图解法,求二元方程组的解,其中 x 和 y 的范围均为 [-5, 5]
2 − xy x =5 e 3 2 2 x+ y x cos x + y + y e = 10 ( )
2
将方程组移项,改写成 f(x, y) = 0 的形式
f(t)
0 -0.1 -0.2
对于非多项式方程,只能求出一个解
-0.3 -0.4 -0.5
0
0.2
0.4
0.6
0.8
1 t
1.2
1.4
1.6
1.8
2
solve 函数的局限性
求解一元非线性方程 (超越方程)
f ( x ) = sin ( x ) + cos ( x x ) − 10
对于稍许复杂的方程,求解结果出现很大误差
一元方程的图解法
一个有阻尼的振动系统,振动方程如下,求出 x (t) = 0.1 对应的时刻 t
x ( t ) = 0.8 e −6t sin ( 30t )
根据振动方程,有
x ( t ) = 0.8 e −6t sin ( 30t ) = 0.1
移项,可得
0.8 e −6t sin ( 30t ) − 0.1 = 0
初值 x0 分别设定为0, 0.1, 0.2, 0.3, 0.4, 0.5 等,求解方程 F 的根,并观察结果
非线性方程 (组) 数值解的一般求法
◼ 使用 fsolve 函数的第二种调用格式,求解方程 F 的根 [x,fval,exitflag] = fsolve(fun,x0,options) ◼ 使用 optimset 函数,设置 options
Matlab 解非线性方程组2

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求解程序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实现讲解

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进行指定非线性方程拟合的问题(1)※1。
优化工具箱的利用函数描述LSQLIN 有约束线性最小二乘优化LSQNONNEG 非负约束线性最小二乘优化问题当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。
具体例子请参阅优化工具箱文档中的相应利用这两个函数的例子。
d. 非线性曲线拟合利用MATLAB的内建函数函数名描述FMINBND 只解决单变量固定区域的最小值问题FMINSEARCH 多变量无约束非线性最小化问题(Nelder-Mead 方法)。
下面给出一个小例子展示一下如何利用FMINSEARCH1.首先生成数据>> t=0:.1:10;>> t=t(:);>> Data=40*exp(-.5*t)+rand(size(t)); % 将数据加上随机噪声2.写一个m文件,以曲线参数作为输入,以拟合误差作为输出function sse=myfit(params,Input,Actural_Output)A=params(1);lamda=params(2);Fitted_Curve=A.*exp(-lamda*Input);Error_Vector=Fitted_Curve-Actural_Output;%当曲线拟合的时候,一个典型的质量评价标准就是误差平方和sse=sum(Error_Vector.^2);%当然,也可以将sse写作:sse=Error_Vector(:)*Error_Vector(:);3.调用FMINSEARCH>> Strarting=rand(1,2);>> options=optimset('Display','iter');>> Estimates=fiminsearch(@myfit,Strarting,options,t,Data);>> plot(t,Data,'*');>> hold on>> plot(t,Estimates(1)*exp(-Estimates(2)*t),'r');Estimates将是一个包含了对原数据集进行估计的参数值的向量。
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运⾏⽰例(同样没有控制输出)明显地,迭代次数减⼩许多。
第4章 MATLAB 非线性方程(组)的求解

x*k
=
g(x* ),即x* 是 g 的不动点,也就是f 的根。
fixpt.m
逐次逼近: 将隐式方程归结为显式计 算
y
y=x
p1 p0
y=g(x)
✓
x
x0
x1 x*
y
y=x
y=g(x)
p0
p1
x x1 x0 x*
y p0
y=x
✓
y=g(x) p1
x0
x*
y
y=g(x) p0
x x1
y=x
是函数表达式中附加的参数x是返回的根fval是根x处的目标函数的值exitflag表明解存在的情况正数表明解存在负数表示解不存在遇到复数nan或者无穷大等
第4章 非线性方程(组)的求解
本章目标:求 f (x) = 0 的根
4.1 二分法 4.2 简单迭代法 4.3 Newton法 4.4 抛物线法 4.5 非线性方程组的求解 4.6 实例解析
p1
x x0 x* x1
4.3 Newton法
原理:将非线性方程线性化 —— Taylor 展开
取 x0 x*,将 f (x)在 x0 做一阶Taylor展开:
f (x)
f ( x0 )
f ( x0 )(x x0 )
f
(
2!
)
(
x
x0
)2,
在
x0
和
x
之间.
将 (x* x0)2 看成高阶小量,则有:
x = g (x)
f (x) 的根
g (x) 的不动点
从一个初值 x0 出发,计算 x1 = g(x0), x2 = g(x1), …,
第二章非线性方程(组)的数值解法的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求解非线性方程组

非线性方程组求解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;。
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求解非线性方程

步骤如下:
(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实现讲解

不动点迭代的图形解释
y
y
y=x
y=x
(p1,p1) P y = g(x)
(p0,g(p0))
P (p1,p1) y = g(x) (p0,g(p0))
O
p1
Pp2
p0
x
O
Pp2
p1
p0
x
0 g ' P 1
1 g ' P 0
单调收敛
振荡收敛
不动点迭代的图形解释
y
y = g(x) y=x
非线性方程(组)在化学计算中的作用
• 多组分混合溶液的沸点、饱和蒸气压计算
• 流体在管道中阻力计算
• 多组分多平衡级分离操作模拟计算
• 平衡常数法求解化学平衡问题
• 定态操作的全混流反应器的操作分析
非线性方程
非线性方程包括:高次代数方程、超越方程及其它们 的组合 与线性方程相比,非线性方程求解问题无论从理论上 还是从计算公式上都要复杂得多 对于高次代数方程,当次数>4时,则没有通解公式可 用,对于超越方程既不知有几个根,也没有同样的求 解方式。实际上,对于n≥3代数方程以及超越方程都 采用数值方法求近似根。
非线性方程(组)求解
非线性方程(组)数值求解基本原理
多项式求根函数-roots
非线性方程求解函数-fzero
非线性方程组求解函数-fsolve
复习与练习
按以下要求编写一个函数计算 A y / x sin(45) x 的值,其中x>0时,y= 3 x ; x<0时,y=2/x; x=0时,返 回错误信息(x cann’t be zero) 。 要求:1)主函数名称为excer1,x作为输如变量,A作 为输出变量;2) 主函数中包括一个子函数myfun用于 计算y的值。
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.1),在区间],[b a 内,可改写成为:)(x x ϕ= (2.1) 取],[0b a x ∈,用递推公式:)(1k k x x ϕ=+, ,2,1,0=k (2.2) 可得到序列:∞==0210}{,,,,k k k x x x x x (2.3)当∞→k 时,序列∞=0}{k k x 有极限x ~,且)(x ϕ在x ~附近连续,则在式(2.2)两边极限,得, )~(~x x ϕ= 即,x ~为方程(2.1)的根。
用Matlab求解非线性方程组

1.fsolve求解非线性方程组方程:F(x)=0x是一个向量,F(x)是该向量的函数向量,返回向量值2.语法x = fsolve(fun,x0)x = fsolve(fun,x0,options)[x,fval] = fsolve(fun,x0)[x,fval,exitflag] = fsolve(...)[x,fval,exitflag,output] = fsolve(...)[x,fval,exitflag,output,jacobian] = fsolve(...)3.描述fsolve 用于寻找非线性系统方程组的零点。
x = fsolve(fun,xO)以x0为初始值,努力寻找在fun中描述的方程组。
x = fsolve(fun,xO,options)以x0为初始值,按照指定的优化设置“options努力寻找在fun 中描述的方程组。
使用optimset 设置这些选项。
[x,fval] = fsolve(fun,xO)返回在解x处的目标函数fun的值[x,fval,exitflag] = fsolve(...)返回exitflag 表示退出条件。
[x,fval,exitflag,output] = fsolve(...)返回output 结构,该结构包含了优化信息。
[x,fval,exitflag,output,jacobian]二fsolve(…)返回在解x 处的Jacobian 函数。
4.输入参数4.1."fun非线性系统方程。
它是一个函数,以x作为输入,返回向量F。
函数fun可以被指定为一个M 文件函数的函数句柄。
x = fsolve(@myfun,x0)这里的myfun 是一个matlab 函数,形如:function F = myfun(x)F = ...% Compute function values at xfun 也可以是一个异步函数的函数句柄:x = fsolve(@(x)sin(x.*x),x0);若用户定义的值为矩阵,则会被自动转换为向量。
Matlab求解非线性方程工程问题的作业2

题目二:超市有A、B、C三种果篮,同时装有苹果、香蕉、橘子三种水果。
现已知在A种果篮中三种水果质量比为2:2:1,B种果篮中为1:2:3,C种果篮中为3:1:1,超市制作一套A、B、C三种果篮样品需消耗苹果6千克、香蕉6千克、橘子7.5千克。
求三种果篮各重几许?一、列方程组设A、B、C三种果篮分别重X、Y、Z千克2X/5+Y/6+3Z/5=62X/5+2Y/6+Z/5=6X/5+3Y/6+Z/5=7.5二、Gauss法直接求解1、输入高斯法程序,保存为Gauss.m文件function [x,det,index]=Gauss(A,b)[n,m]=size(A);nb=length(b);if n~=merror('The rows and columns of matrix A must be equal!');return;endif m~=nberror('The columns of A must be equal the length of b!');return;endindex=1;det=1;x=zeros(n,1);for k=1:n-1a_max=0;for i=k:nif abs(A(i,k))>a_maxa_max=abs(A(i,k));r=i;endendif a_max<1e-10index=0;return;endif r>kfor j=k:nz=A(k,j);A(k,j)=A(r,j);A(r,j)=z;endz=b(k);b(k)=b(r);b(r)=z;det=-det;endfor i=k+1:nm=A(i,k)/A(k,k);for j=k+1:nA(i,j)=A(i,j)-m*A(k,j);endb(i)=b(i)-m*b(k);enddet=det*A(k,k);enddet=det*A(n,n);if abs(A(n,n))<1e-10index=0;return;endfor k=n:-1:1for j=k+1:nb(k)=b(k)-A(k,j)*x(j);endx(k)=b(k)/A(k,k);end2、输入方程组>> A=[2/5 1/6 3/5;2/5 2/6 1/5;1/5 3/6 1/5]A =0.4000 0.1667 0.60000.4000 0.3333 0.20000.2000 0.5000 0.2000>> B=[6 6 7.5]'B =6.00006.00007.50003、执行程序求解>> [x,det,index]=Gauss(A,B)x =2.500012.00005.0000det =0.0600index =1故得出结果:A、B、C三种果篮分别重2.5、12、5千克。
实验2利用matlab解非线性、微分方程组答案

实验2 利用matlab解(非)线性、微分方程(组)-答案1、对于下列线性方程组:(1)请用直接法求解;(2)请用LU分解方法求解;(3)请用QR分解方法求解;(4)请用Cholesky分解方法求解。
(1)>> A=[2 9 0;3 4 11;2 2 6]A =2 9 03 4 112 2 6>> B=[13 6 6]'B =1366>> x=inv(A)*Bx =7.4000-0.2000-1.4000或:>> X=A\BX =7.4000-0.2000-1.4000(2)>> [L,U]=lu(A);>> x=U\(L\B)x =7.4000-0.2000-1.4000(3)>> [Q,R]=qr(A);>> x=R\(Q\B)x =7.4000-0.2000-1.4000(4)>> chol(A)??? Error using ==> cholMatrix must be positive definite.2、设迭代精度为10-6,分别用Jacobi 迭代法、Gauss-Serdel 迭代法求解下列线性方程组,并比较此两种迭代法的收敛速度。
Jacobi 迭代法:>> A=[10 -1 0;-1 10 -2;0 -2 10];>> B=[9 7 5]';>> [x,n]=jacobi(A,B,[0,0,0]',1e-6)x =0.99370.93680.6874n =11Gauss-Serdel 迭代法:>> A=[10 -1 0;-1 10 -2;0 -2 10];>> B=[9 7 5]';>> [x,n]=gauseidel(A,B,[0,0,0]',1e-6)x =0.99370.93680.6874n =73、求解非线性方程010=-+x xe x 在2附近的根。
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 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非线性方程组—Matlab—fsolve—机械 CAD 论坛—huright
实例六:
对于求解非线性方程组一般用 fsolve 命令就可以了,但是对于方程组中某一系 数是变化的,该怎么求呢? %定义方程组如下,其中 k 为变量 function F = myfun(x,k) H=0.32; Pc0=0.23;W=0.18; F=[Pc0+H*(1+1.5*(x(1)/W-1)-0.5*(x(1)/W-1)^3)-x(2); x(1)-k*sqrt(x(2))]; %求解过程 H=0.32; Pc0=0.23;W=0.18; x0 = [2*W; Pc0+2*H]; % 取初值 options = optimset('Display','off'); k=0:0.01:1; % 变量取值范围[0 1] for i=1:1:length(k) kk=k(i); x = fsolve(@(x) myfun(x,kk), x0, options);%求解非线性方程组 x1(i)=x(1); x2(i)=x(2); end plot(k,x1,'-b',k,x2,'-r'); xlabel('k') legend('x1','x2') (来自振动论坛,作者:studyboy)
(4)检验
fxy1=sin(xy(1)-xy(2));fxy2=cos(x y(1)+xy(2));disp([fxy1,fxy2]) 1.0e-006 *
---------------------------------------------------------------------
非线性方程组—Matlab—fsolve—机械 CAD 论坛—huolve—机械 CAD 论坛—huright
实例三:
求下列非线性方程组在(0.5,0.5) 附近的数值解。 (1) 建立函数文件 myfun.m。 function q=myfun(p) x=p(1); y=p(2); q(1)=x-0.6*sin(x)-0.3*cos(y); q(2)=y-0.6*cos(x)+0.3*sin(y); (2) 在给定的初值 x0=0.5,y0=0.5 下,调用 fsolve 函数求方程的根。 x=fsolve('myfun',[0.5,0.5]',optimset('Display','off')) x= 0.6354 0.3734
实例五: ①建立文件 myfxeq05.m function f=myfxeq05(xvect) x = xvect(1); y = xvect(2); z = xvect(3); f(1)=sin(x) + y^2 + log(z) - 7 f(2)=3*x + 2^y - z^3 + 1 f(3)=x + y + z – 5 ②解方程 clear all disp('Solve the following set of nonlinear algebraic equations:') disp(' sin(x) + y^2 + ln(z) - 7 = 0 ') disp(' 3*x + 2^y - z^3 + 1 = 0 ') disp(' x + y + z - 5 = 0 ') disp(' ') xguess=[1 1 1]'; xvect = fsolve('myfxeq05', xguess); x = xvect(1); y = xvect(2); z = xvect(3); disp('The roots from the default "fsolve" are: ') disp([' x = ', num2str(x) ]) disp([' y = ', num2str(y) ]) disp([' z = ', num2str(z) ]) % Repeat with a different set of options ------------------------------options(2) = 1.e-6; %Tolerance for x options(3) = 1.e-6; %Tolerance for f options(5) = 1; %Levenberg-Marquardt Method xvect = fsolve('myfxeq05', xguess, options); x = xvect(1); y = xvect(2); z = xvect(3); disp('The roots from "fsolve" with Levenberg-Marquardt are: ') disp([' x = ', num2str(x) ]) disp([' y = ', num2str(y) ]) disp([' z = ', num2str(z) ])
-1.5
-1
-0.5
0
0.5
1
1.5
2
图 5.6.3-1
两个二元函数 0 等位线的交点图
(2)从图形获取零点的初始近似值 在图 5.6.3-1 中,用 ginput 获取两个函 数 0 等位线(即三线组中间那条线)交点的 坐标。
[x0,y0]=ginput(2); %在图上取两个点的坐标 disp([x0,y0]) -0.7926 0.7926 -0.7843 0.7843
非线性方程组—Matlab—fsolve—机械 CAD 论坛—huright
实例四:
【例 5.6.3-1 】 求 解 二 元 函 数 方 程 组
2 1.5 1 0.5 0 -0.5 -1 -1.5 -2 -2
f 1 ( x, y ) sin( x y ) 0 的零点。 f 2 ( x, y ) cos( x y ) 0
(0)从三维坐标初步观察两函数图形相交 情况
x=-2:0.05:2;y=x;[X,Y]=meshgrid(x ,y); %产生 x-y 平面上网点坐标 F1=sin(X-Y);F2=cos(X+Y); F0=zeros(size(X)); surf(X,Y,F1), xlabel('x'),ylabel('y'), view([-31,62]),hold on, surf(X,Y,F2),surf(X,Y,F0), shading interp, hold off
图 5.6.3-0 两函数的三维相交图
0.7854
0.7854
(1)在某区域观察两函数 0 等位线的交点 情况
clear; x=-2:0.5:2;y=x;[X,Y]=meshgrid(x, y); %产生 x-y 平面上网点坐标 F1=sin(X-Y);F2=cos(X+Y); v=[-0.2, 0, 0.2]; %指定三个等位值, 是 为了更可靠地判断 0 等位线的存在。 contour(X,Y,F1,v) %画 F1 的三条等位线。 hold on,contour(X,Y,F2,v),hold off %画 F2 的三条等位线。
非线性方程组—Matlab—fsolve—机械 CAD 论坛—huright
非线性方程组求解-Matlab-fsolve
实例一: ①建立文件 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()主要求解复杂非线性方程和方程组,求解过程是一个逼近过程。
实例二: ①建立文件 fun.m
function F=myfun(x) F=[x(1)-3*x(2)-sin(x(1));2*x(1)+x(2)-cos(x(2))];
②然后在命令窗口求解:
>> x0=[0;0]; >> options=optimset('Display','iter'); >> [x,fv]=fsolve(@myfun,x0,options) %MATLAB 显示的优化过程 %设定求解初值 %设定优化条件 %优化求解 Norm of step
( 3 ) 利 用 fsolve 求 精 确 解 。 以 求 (0.7926,7843)附近的解为例。 本例直接用字符串表达被解函数。注 意:在此,自变量必须写成 x(1), x(2)。假如 写成 xy(1), xy(2),指令运行将出错。
fun='[sin(x(1)-x(2)),cos(x(1)+x( 2))]'; xy=fsolve(fun,[x0(2),y0(2)]) xy =
First-order Trust-region Iteration Func-count f(x) optimality radius 0 3 1 2 1 1 6 0.000423308 0.5 0.0617 1 2 9 5.17424e-010 0.00751433 4.55e-005 1.25 3 12 9.99174e-022 1.15212e-005 9.46e-011 1.25 Optimization terminated: first-order optimality is less than options.TolFun. x= 0.4966 0.0067 fv = 1.0e-010 * 0.3161 0.0018