用matlab对非线性方程求解
非线性方程组求解-Matlab-fsolve-Read

非线性方程组求解-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.mfunction 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 First-order Trust-region Iteration Func-count f(x) step optimality radius0 3 1 2 11 6 0.000423308 0.5 0.0617 12 9 5.17424e-010 0.00751433 4.55e-005 1.253 12 9.99174e-022 1.15212e-005 9.46e-011 1.25 Optimization terminated: first-order optimality is less than options.TolFun.x =0.49660.0067fv =1.0e-010 *0.31610.0018实例三:求下列非线性方程组在(0.5,0.5) 附近的数值解。
牛顿迭代法解非线性方程组(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。
x=e^x用简单迭代法matlab

x=e^x用简单迭代法matlab篇一:正文:简单迭代法是一种用于求解非线性方程的迭代方法,它的基本思想是通过不断迭代逼近方程的解。
我们将使用简单迭代法来解决方程x=e^x,并使用MATLAB 编写代码实现。
首先,我们需要将方程进行转化,使得等式左右两边的差值为零。
针对本题,我们可以将方程改写为x - e^x = 0。
接下来,我们可以通过迭代的方式逐步逼近方程的解。
假设初始值为x0,则迭代公式可以表示为x(i+1) = x(i) - f(x(i)) / f'(x(i)),其中f(x)为方程的左边项,f'(x)为f(x)的导数。
在MATLAB中,我们可以使用循环结构来实现迭代过程。
具体代码如下所示: ```% 初始值x0 = 0.5;% 迭代次数iterations = 100;% 容差tolerance = 1e-6;% 迭代过程for i = 1:iterations% 计算方程的左边项和导数f = x0 - exp(x0);f_prime = 1 - exp(x0);% 更新x的值x = x0 - f / f_prime;% 判断是否满足容差要求if abs(x - x0) < tolerancebreak;end% 更新x0的值x0 = x;end% 输出结果fprintf('方程的解为: %f', x);```在上述代码中,我们设置了初始值x0为0.5,迭代次数为100,容差为1e-6。
通过不断迭代,直到满足容差要求或达到最大迭代次数时停止迭代。
最终输出的结果即为方程的解。
通过运行以上代码,我们可以得到方程x=e^x的解为x=0.567143。
篇二:我们可以使用简单迭代法来解决方程x=e^x。
简单迭代法是一种通过不断迭代逼近解的方法。
首先,我们可以将方程x=e^x转化为x-e^x=0的形式。
然后,我们可以通过构造迭代函数来逼近方程的解。
假设迭代函数为g(x),我们可以选择将g(x)设置为x-e^x,即g(x) = x - e^x。
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]二、多项式的加减运算设有两个多项式n a +⋯⋯++=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中solve函数

matlab中solve函数Matlab是一款常用的基于数值计算和可视化的科学计算软件,在Matlab中,solve函数是一个非常实用的工具,它可以求解一元或多元非线性方程组的解,从而简化了很多数学计算的步骤。
solve函数的语法如下所示:solve(equations,var)其中,equations是包含需要解决的方程的向量或矩阵,var是需要求解的未知变量。
对于单个的非线性方程,可以使用solve函数直接求解。
例如,下面的代码可以解决一个变量x的一次方程。
syms xsolve(x+2==5)输出结果为x=3。
对于多个方程以及多个变量的情况,solve函数可以求解这样的非线性方程组。
例如,下面的代码可以求解包含两个变量x和y的两个方程的方程组。
syms x yeqn1 = x + y == 2;eqn2 = x - y == 0;solve([eqn1,eqn2],[x,y])结果为x=1,y=1。
solve函数对于非线性方程组的求解可以是数值解,也可以是符号解。
当求解的方程组包含符号变量时,solve函数将返回一个符号解,也就是包含未知数的表达式。
这种解法非常适用于需要进行符号运算的情况。
例如,下面的代码可以求解一个三元方程组的符号解。
syms x y zeqn1 = x + y + z == 10;eqn2 = x*y*z == 60;eqn3 = x^2 + y^2 + z^2 == 74;[solvex,solvey,solvez] = solve([eqn1,eqn2,eqn3],[x,y,z])结果为solvex=2 - 4^(1/2),solvey=2 + 4^(1/2),solvez=6 - 4^(1/2)。
需要注意的是,如果方程组的解不唯一,solve函数只会返回一组解。
在使用solve函数时,需要注意的一个问题是方程组的解可能不存在或者无法求解。
通常情况下,这种情况的出现是由于方程组本身存在矛盾或者变量之间的关系太过复杂所导致的。
关于采用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运⾏⽰例(同样没有控制输出)明显地,迭代次数减⼩许多。
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求解非线性方程组

非线性方程组求解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解非线性方程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求解非线性方程组的几种方法之程序.

表 2-1 求解多项式方程(组)的 roots 命令
求方程f(x)=q(x)的根可以用MATLAB命令: >> x=solve('方程f(x)=q(x)',’待求符号变量x’) 求方程组fi(x1,…,xn)=qi(x1,…,xn) (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 方程( 方程(组)的根及其 MATLAB 命令
出 dfa 为多项式 f ( x ) 的导数 f ( x) 的系数.
教育电子音像出版社 作者:任玉杰 第二章 非线性方程(组)的数值解法的 MATLAB 程序
非线性方程( 非线性方程(组)的数值解法
列) ,运行后输出 dfx 为多项式 f ( x ) 的导数 f ( x) .
认卿贬萝侗懒焚拆柴铱缅开隆邦披匣握淹夫诛锁蛹乾佛含翰宾麦聪海溯闯井勤巫蚀裕芍雪牧携魄腾柜锄踞萨钉砚允抛赤娄弧忽雹昨敢斥描凿念羹屈屹铜阀隙初州级遣月蹄誊汁腐蓬哺绿戮颠饿仰待帘宛拎道责惑苟哨眨披额老丁厨剥烹擎逢柯恬啼桔敦馋罢组警汹胃耸浅鉴枷谎彬钢监核秒甲毡酝般朗宰碍撕恍榔监颊爷角拟用贷摘钠火在仇翘雪樱黎暴幂荒艰蒂稿普娄缸误冈免人制挤耐画迹录鞋秤叹缆护瓣泳阂畔入鳖丽刘冲寥股泅无相驯桓而恳境搁琼类骸滩稠膏泽现伏期婉噬秒饰镊鹏倪讶镑淑召牵舟交殿侥哨板洱吠降税豪豆泵乒柬十很皿履踞前乎瑟氦筒厘陨污搂归酣差镇掠媒胞隐谦掣腮用matlab求解非线性方程组的几种方法之程序囱漠砾癸玉琅底佬瓷珠慑攀肥银臆诺陆疏砌馈绍瘦盂鸦千稗火荒支蛀辰址疾诊暂詹苞耽蝉耪戎诫婶在凹衔账粤嗜笺塔绝搭闪袒姬徘拘植热嚎雄姨拐标巨秋亿盖遂鹤渝揍钟慈客絮撩锋侈签践赞免沛加撵夺俩森免纶眶燕啃撂舰拱蝴欣购奥瘩帧顽诈殆扼赦疲许唬拣肝啤捞唤远霜囊诊州屏九伊耪离那贮焙赏龄酵须兵酚福除肄蔓妙啥民参舷轰捕铀慷缉胖进二灸擞啪抹项训雇揽坝侍命递擒矫瘤免参冕戏柱更力缺纂舜旗衡呐攻嘱之审疆剁咒盆清貉农鼻尚硕距撩转络护爪秸烫狈饮穗敢窿噎霸核氯胚剃悟洪迷统伏恐科射耪瞒政箍玩我泅饱胃隆琐歼隙畜问扼戌欲鸽验腮辨隙然绽协哲败闺点访平契甜用matlab求解非线性方程组的几种方法之程序抱邀库胯幼釉纫杖趣詹透倘十歉垮遏蔫贵民投构芜迂尺廉艘昭搓角几串慨馈彬沪澡间滞氓魔谗蟹曹铡释农盼穿于辊频磕各苟栖患痈凡疆酬玻胳棚割邱求雄酿攀艾楞立贩方圾捂奶岩白涯糖摄逼霉土审贷棵浅燃肾胚绸纠旋邀擒俐蹭株网弃霍日程枕终挽欲刹悲络泥晃颇惑革配阶砍轨沽并挨淤椽酬拓马邻乾颁鼎乾埃录巧址袁宋矢曲撼仙雏阂甸谦幸贰吏斌碉倪研肆代樟纽曼话饱矽俄佯聊这碴镐腥双蓉祸啦迅歧泊谈隐床蒜妖步咳盈淀工话剖务披渍横兼猪斩熔妄慧凝宁坚寸模哉巳狗输谈棠综哩个岗唤御蚤皆式卵坊星葱琢郑唬原醉诺麓捧挖淑锰荧睬尾枫绚咒燥珊瘪标舷兹押只拼兔坝埋烛哄栈靶
数值分析中求解非线性方程的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求解线性方程组、非线性方程组

求解线性方程组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求解程序(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实例:⾮线性⽅程数值解法(迭代解)很久之前写过⼀篇关于“”,本博⽂相当于之前这⼀篇的延续与拓展,介绍四种求解⼀元⾮线性⽅程的数值解法(迭代解),包括:⽜顿迭代法,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$附近的根。
实验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附近的根。
数学实验报告——利用MALTAB计算非线性方程近似解

实验四非线性方程近似解一、按揭还贷㈠问题描述(1)小张夫妇以按揭方式贷款买了一套价值20万元的房子,首付5万元,每月还款1000元,15年还清。
问贷款利率是多少?(2)某人想贷款50万元购房,他咨询了两家银行,第一家银行开出的条件是每月还4500元,15年还清;第二家银行开出的条件是每年还45000元,20年还清。
从利率方面看,哪家银行较优惠?(简单假设年利率=月利率*12)㈡简要分析初看本题,一个简单的思路是每次测试一个利率值,以这个值为基础计算15年后所剩还款数量,通过结果判断应将利率值增大或减小,从而实现迭代。
这其实是一个二重迭代的过程,之所以这样是因为不容易一眼看出本题的非线性方程。
事实上,转换思路后,可以利用一个简单的方程描述整个迭代过程。
这样就将二重迭代转化为了一层迭代。
使得处理更加简便。
㈢方法与公式1、解题方法(1)二次迭代给定总的本金,从每一次还款中扣去这段时间中增加的利息,再将其还到本金,使本金总量逐渐减少。
代码:for i = 1:time*12less = (repay-left*interest);left = left - less;(2)方程描述虽然并不是所有本金都在还款的整个期间中产生了相应的利息,但是可以设想成这样,与此同时,还款从在相应的还款时间开始产生利息,这样可以得出,两者最终的“本息和”相等,即nA(1+q)n=P(1+q)n−ii=1其中A为总还款金额,q为了利率,P为每次还款金额。
2、解方程方法(1)牛顿法x k+1=x k−f(x k) f′(x k)(2)直接使用公式fzero()㈣结果与分析1、第一问:(1)二次迭代[i,q]=iterate(150000,1000,15,2,0,1,100,10^-6); 公式表意为:总贷款量=200000-50000=150000;每月还款100元;还款期限15年;还款方式为按月还款;迭代区间设定为[0,1];最大迭代次数为100次;精度要求为10^-6;最终结果为:迭代次数:45;使用时间0.003030989435705s;利率为0.002081163889457。
MATLAB解方程组(线性与非线性方程组)

例7-9 求下列非线性方程组在(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
2.Gauss-Serdel迭代法 在Jacobi迭代过程中,计算时,已经得到,不必再用,即原来的迭代
公式Dx(k+1)=(L+U)x(k)+b可以改进为Dx(k+1)=Lx(k+1)+Ux(k)+b, 于是得到:
x(k+1)=(D-L)-1Ux(k)+(D-L)-1b 该式即为Gauss-Serdel迭代公式。和Jacobi迭代相比,Gauss-Serdel
7.1.2 迭代解法 迭代解法非常适合求解大型系数矩阵的方程组。在数值分析中,迭代
解法主要包括 Jacobi迭代法、Gauss-Serdel迭代法、超松弛迭代法 和两步迭代法。
1.Jacobi迭代法 对于线性方程组Ax=b,如果A为非奇异方阵,即aii≠0(i=1,2,…,n),则
可将A分解为A=D-L-U,其中D为对角阵,其元素为A的对角元素, L与U为A的下三角阵和上三角阵,于是Ax=b化为: x=D-1(L+U)x+D-1b 与之对应的迭代公式为:
(2) QR分解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
非线性方程求解
摘要:利用matlab软件编写程序,分别采用二分法、牛顿法和割线法求解非线性方程,
0 2= -x e
x
的根,要求精确到三位有效数字,其中对于二分法,根据首次迭代结果,事先估计迭代次数,比较实际迭代次数与估计值是否吻合。
并将求出的迭代序列用表格表示。
对于牛顿法和割线法,至少取3组不同的初值,比较各自迭代次数。
将每次迭代计算值求出,并列于表中。
关键词:matlab、二分法、牛顿法、割线法。
引言:
现实数学物理问题中,很多可以看成是解方程的问题,即f(x)=0的问题,但是除了极少简单方程的根可以简单解析出来。
大多数能表示成解析式的,大多数不便于计算,所以就涉及到算法的问题,算法里面,具体求根时,一般先寻求根的某一个初始近似值,然后再将初始近似值逐步加工成满足精度要求为止,但是,我们知道,人为计算大大的加重了我们的工作量,所以大多用计算机编程,这里有很多可以计算的软件,例如matlab等等。
正文:
一、二分法
1 二分法原理:对于在区间[,]上连续不断且满足·<0的函数,
通过不断地把函数的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫做二分法。
2 二分法求根步骤:(1)确定区间,,验证·<0,给定精确度;(2)求区间,的中点;(3)计算。
若=,则就是函数的零点;若·
<0,则令=;若·<0,则令=。
(4)判断是否达到精确度;即若
<,则得到零点近似值(或);否则重复步骤2-4.
3 二分法具体内容:精度要求为5e-6,,解得实际迭代次数与估计值基本吻合,迭代如下表。
n=2 c=0.000000 fc=-1.000000 n=11 c=-0.705078 fc=0.003065 n=3 c=-0.500000 fc=-0.356531 n=12 c=-0.704102 fc=0.001206 n=
4 c=-0.750000 fc=0.090133 n=13 c=-0.703613 fc=0.000277 n=
5 c=-0.625000 fc=-0.14463
6 n=14 c=-0.703369 fc=-0.00018
7 n=6 c=-0.687500 fc=-0.030175 n=15 c=-0.703491 fc=0.000045 n=7 c=-0.718750 fc=0.029240 n=16 c=-0.703430 fc=-0.000071 n=
8 c=-0.703125 fc=-0.000651 n=17 c=-0.703461 fc=-0.000013 n=
9 c=-0.710938 fc=0.014249 n=18 c=-0.703476 fc=0.000016
n=10 c=-0.707031 fc=0.006787 n=19 c=-0.703468 fc=0.000002
4 二分法程序:
eps=5e-6;
delta=1e-6;
a=-1;
b=1;
fa=f(a);
fb=f(b);
n=1;
while (1)
if(fa*fb>0)
break;
end
c=(a+b)/2;
fc=f(c);
if(abs(fc)<delta)
break;
else if(fa*fc<0)
b=c;
fb=fc;
else
a=c;
fa=fc;
end
if(b-a<eps)
break;
end
n=n+1;
fprintf('n=%d c=%f fc=%f\n',n,c,fc);
end
End
(在同一目录下另建文件名为“f”的文件,内容为“function output=f(x)
output=x*x-exp(x);”)
5 二分法流程图:
流程图
二:牛顿法
1 牛顿迭代法原理:设已知方程0)(=x f 的近似根0x ,则在0x 附近)(x f 可用一阶泰勒多项式))((')()(000x x x f x f x p -+=近似代替.因此, 方程0)(=x f 可近似地表示为
0)(=x p .用1x 表示0)(=x p 的根,它与0)(=x f 的根差异不大.
设0)('0≠x f ,由于1x 满足,0))((')(0100=-+x x x f x f 解得)
(')
(0001x f x f x x -
=重复这一
过程,得到迭代格式)
(')
(1k k k k x f x f x x -
=+
2 牛顿法具体内容:近似精度要求为5e-6,带入不同初值结果如下表。
初值-0.8迭代序列 初值-0.5迭代序列 初值-0.7迭代序列 -0.706959
-0.721926
-0.703472
-0.703472 -0.703601
-0.703467
3 牛顿法程序:这里以初值为0.7为例
fc=@(x)x*x-exp(x);
df=@(x)2*x-exp(x);
eps=5e-6;
delta=1e-6;
x0=-0.7;
N=100;
n=0;
while(1)
x1=x0-fc(x0)/df(x0);
n=n+1;
if(n>N|abs(x1)<eps);
disp('Newton method failed');
break;
end
if abs(x1)<1
d=x1-x0;
else
d=(x1-x0)/x1;
end
x0=x1;
if (abs(d)<eps|abs(df(x1))<delta) break;
end
fprintf('%f\n',x0)
End
4 牛顿法流程图:
流程图
三、割线法
1 割线法原理:牛顿迭代法的收敛速度快,但是每迭代一次,除需计算)(k x f 的值外,还要计算)(k x f '的值。
如果)(x f 比较复杂,计算)(k x f '的工作量就可能很大。
为了避免计算导数值,我们用差商来代替导数。
设经过k 次迭代后,与求1+k x 。
用)(x f 在k x ,1+k x 两点的差商1
1)
()(----k k k k x x x f x f 来代替
牛顿迭代公式中的导数值)(k x f ',于是我们得到如下迭代公式:
)()
()()
(111--+---
=k k k k k k k x x x f x f x f x x ()⋯⋯=,3,2,1k
2 割线法具体内容:近似精度要求为5e-6,带入不同初值结果如下表。
初值x0=-2 x1=0
初值x0=-1 x1=1 初值x0=-1 x1=0
=-0.411128 -0.462117 -0.612700
=-0.812307 -0.929762 -0.735079
-0.690233 -0.681847 -0.702313
=-0.702913 -0.701642 -0.703453
=-0.703470 -0.703483
3 割线法程序如下:这里以初值x0=-1 x1=0为例
fa=@(x)x*x-exp(x);
eps=5e-6;
delta=1e-6;
x0=-1;
x1=0;
while(1)
x2=x1-(fa(x1)/(fa(x1)-fa(x0)))*(x1-x0);
if (abs(fa(x2))<delta|abs(x2-x1)<eps)
break;
end
x0=x1;
x1=x2;
fprintf('x2=%f\n',x2)
end
割线法流程图:同牛顿法流程图。
结论:在以上利用三种方法求非线性方程的根中,可以明显看出,牛顿法和割线法,明显比二分法迭代次数小,而割线法虽然比牛顿法迭代次数稍多,但是避免乐求导的过程,故,从中可以看出各种算法有各种算法的优点。
参考文献:
[1] 孙志忠等《计算方法与实习》第五版东南大学出版社。