MATLAB应用 求解非线性方程
Matlab中常用的数值计算方法
Matlab中常用的数值计算方法数值计算是现代科学和工程领域中的一个重要问题。
Matlab是一种用于数值计算和科学计算的高级编程语言和环境,具有强大的数值计算功能。
本文将介绍Matlab中常用的数值计算方法,包括数值积分、数值解微分方程、非线性方程求解和线性方程组求解等。
一、数值积分数值积分是通过数值方法来近似计算函数的定积分。
在Matlab中,常用的数值积分函数是'quad'和'quadl'。
'quad'函数可以用于计算定积分,而'quadl'函数可以用于计算无穷积分。
下面是一个使用'quad'函数计算定积分的例子。
假设我们想计算函数f(x) = x^2在区间[0, 1]上的定积分。
我们可以使用如下的Matlab代码:```f = @(x) x^2;integral = quad(f, 0, 1);disp(integral);```运行这段代码后,我们可以得到定积分的近似值,即1/3。
二、数值解微分方程微分方程是描述自然界各种变化规律的数学方程。
在科学研究和工程应用中,常常需要求解微分方程的数值解。
在Matlab中,可以使用'ode45'函数来求解常微分方程的数值解。
'ode45'函数是采用基于Runge-Kutta方法的一种数值解法。
下面是一个使用'ode45'函数求解常微分方程的例子。
假设我们想求解一阶常微分方程dy/dx = 2*x,初始条件为y(0) = 1。
我们可以使用如下的Matlab代码:```fun = @(x, y) 2*x;[x, y] = ode45(fun, [0, 1], 1);plot(x, y);```运行这段代码后,我们可以得到微分方程的数值解,并绘制其图像。
三、非线性方程求解非线性方程是指方程中包含非线性项的方程。
在很多实际问题中,我们需要求解非线性方程的根。
非线性方程组求解-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应用 求解非线性方程
第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牛顿迭代法求方程
一、引言在数值计算中,求解非线性方程是一项常见的任务。
牛顿迭代法是一种常用且有效的方法,它通过不断逼近函数的零点来求解方程。
而在MATLAB中,我们可以利用其强大的数值计算功能来实现牛顿迭代法,快速求解各种非线性方程。
二、牛顿迭代法原理与公式推导1. 牛顿迭代法原理牛顿迭代法是一种利用函数的导数信息不断逼近零点的方法。
其核心思想是利用当前点的切线与x轴的交点来更新下一次迭代的值,直至逼近方程的根。
2. 公式推导与迭代过程假设要求解方程f(x)=0,在初始值x0附近进行迭代。
根据泰勒展开,对f(x)进行一阶泰勒展开可得:f(x) ≈ f(x0) + f'(x0)(x - x0)令f(x)≈0,则有:x = x0 - f(x0)/f'(x0)将x带入f(x)的表达式中,即得到下一次迭代的值x1:x1 = x0 - f(x0)/f'(x0)重复以上过程,直至达到精度要求或者迭代次数上限。
三、MATLAB中的牛顿迭代法实现1. 编写函数在MATLAB中,我们可以编写一个函数来实现牛顿迭代法。
需要定义原方程f(x)的表达式,然后计算其一阶导数f'(x)的表达式。
按照上述推导的迭代公式,编写循环语句进行迭代计算,直至满足精度要求或者达到最大迭代次数。
2. 调用函数求解方程在编写好牛顿迭代法的函数之后,可以通过在MATLAB命令窗口中调用该函数来求解具体的方程。
传入初始值、精度要求和最大迭代次数等参数,即可得到方程的近似根。
四、牛顿迭代法在工程实践中的应用1. 求解非线性方程在工程领域,很多问题都可以转化为非线性方程的求解问题,比如电路分析、控制系统设计等。
利用牛顿迭代法可以高效地求解这些复杂方程,为工程实践提供了重要的数值计算手段。
2. 优化问题的求解除了求解非线性方程外,牛顿迭代法还可以应用于优化问题的求解。
通过求解目标函数的导数等于0的方程,可以找到函数的极值点,从而解决各种优化问题。
matlab中的fslove函数
matlab中的fslove函数MATLAB中的fslove函数是一个用于求解非线性方程的函数。
在数学和工程领域中,非线性方程是一类不能表示为一次方程的方程。
这类方程在实际问题中非常常见,因此求解非线性方程的方法具有重要意义。
fslove函数的使用方法非常简单,只需要输入一个函数句柄和一个初始值,即可得到方程的解。
函数句柄是指对方程左侧的函数进行封装,初始值是指近似解的初始估计值。
fslove函数会根据这个初始值,通过迭代的方式逐步逼近方程的解。
在使用fslove函数时,我们需要注意一些问题。
首先,初始值的选择对求解的结果有很大影响。
如果初始值选择不当,可能会导致求解失败或者得到错误的解。
因此,我们需要根据具体问题的特点,选择一个合适的初始值。
fslove函数在求解非线性方程时,可能会遇到收敛速度过慢的问题。
这时,我们可以通过设置迭代的最大次数来控制求解的精度和效率。
如果迭代次数超过了设定的最大次数,fslove函数会给出一个警告信息。
fslove函数还可以求解多元非线性方程组。
这时,我们需要将多元方程组转化为向量形式,然后使用fslove函数进行求解。
在求解多元方程组时,初始值的选择尤为重要,因为多元方程组的解可能有多个。
在实际应用中,fslove函数具有广泛的用途。
例如,在电路设计中,我们经常需要求解非线性电路方程,通过使用fslove函数,可以高效地求解电路的工作点。
在数值分析中,fslove函数可以用于求解微分方程的边界条件。
此外,在优化问题中,fslove函数可以用于求解目标函数的最优解。
fslove函数是MATLAB中一个非常强大的工具,可以用于求解各种非线性方程。
通过合理选择初始值和设定迭代次数,我们可以得到准确且高效的求解结果。
无论是在科研还是工程实践中,fslove函数都能帮助我们解决复杂的非线性问题。
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-fsolve函数求解多元非线性方程
matlab-fsolve函数求解多元⾮线性⽅程记录⼀下代码,⽅便下次套⽤模板options=optimset('MaxFunEvals',1e4,'MaxIter',1e4);[x,fval,exitflag] = fsolve(@(x) myfun1(x),[75;1.5],options)function f = myfun1(x)f=tan(x(1)*pi/180) - ( ( 1025*9.8*pi*x(2)/4-980 )/(0.625*4*(2-x(2))*24*24) );%有两个未知数x(1)和x(2),从参数⾥传进来endoptions理解成设定要求,精度范围,没有则默认,是多少问题不⼤。
[75;1.5]是x(1)和x(2)的初值,如果是同⼀个数不同初值则是[ 70 1;75 1.5 ],在初值附近找最优解。
理解成:或许有多个最优解,如果初值不⼀样,最优解也不⼀样。
⾮线性⼏乎都是近似解。
⾄于初值怎么设置,结合问题分析,⽐如杆⼦靠墙的倾斜⾓度⼤约在60度以上,⽽不是⼗⼏⼆⼗度。
函数myfun1的求解情况是f=0。
fval表⽰误差,越⼩越好。
exitflag表⽰迭代退出条件,为1的时候最理想。
1 fsolve converged to a root.2 Change in X too small.3 Change in residual norm too small.4 Computed search direction too small.0 Too many function evaluations or iterations.-1 Stopped by output/plot function.-2 Converged to a point that is not a root.-3 Trust region radius too small (Trust-region-dogleg).最终求出来两个值,分别表⽰两个未知数x(1)和x(2)。
matlab解方程组的函数
matlab解方程组的函数在科学和工程计算中,解方程组是一项非常常见且重要的任务。
方程组是由多个方程组成的集合,其中每个方程都包含有待求解的未知变量。
解方程组的目标是找到一组满足所有方程的未知变量的值。
Matlab是一种功能强大的数值计算软件,它提供了许多用于解方程组的函数。
本文将介绍一些常用的Matlab解方程组函数,并使用实例演示它们的用法。
一、Matlab解方程组的函数概述Matlab提供了多种解方程组的函数,包括直接法和迭代法。
这些函数可以帮助我们高效地求解线性方程组和非线性方程组。
以下是一些常用的Matlab解方程组函数:1.linsolve函数:用于求解线性方程组。
它可以使用直接法(LU分解、Cholesky分解)或迭代法(Jacobi、Gauss-Seidel)来解线性方程组。
2.fsolve函数:用于求解非线性方程组。
它使用迭代法来逐步逼近非线性方程组的解。
3.ode45函数:用于求解常微分方程组。
它使用Runge-Kutta方法来数值求解微分方程组。
4.vpasolve函数:用于求解符号方程组。
它可以求解包含符号未知变量的方程组。
接下来,我们将详细介绍每个函数的用法,并给出相关的实例。
二、linsolve函数2.1 求解线性方程组linsolve函数用于求解线性方程组,语法如下:X = linsolve(A, B)其中,A是系数矩阵,B是常数向量。
函数将返回未知变量的解向量X。
2.2 示例考虑以下线性方程组:2x + 3y = 74x - 5y = 2我们可以使用linsolve函数求解:A = [2, 3; 4, -5];B = [7; 2];X = linsolve(A, B);结果X将包含未知变量x和y的解。
三、fsolve函数3.1 求解非线性方程组fsolve函数用于求解非线性方程组,语法如下:X = fsolve(fun, X0)其中,fun是一个函数句柄,表示非线性方程组的函数,X0是初始解向量。
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十个简单案例编写
matlab十个简单案例编写1. 求解线性方程组线性方程组是数学中常见的问题之一,而MATLAB提供了用于求解线性方程组的函数。
例如,我们可以使用"linsolve"函数来求解以下线性方程组:2x + 3y = 74x - 2y = 2代码如下所示:A = [2, 3; 4, -2];B = [7; 2];X = linsolve(A, B);disp(X);解释:上述代码定义了一个2x2的矩阵A和一个2x1的矩阵B,分别表示线性方程组的系数矩阵和常数向量。
然后,使用linsolve函数求解线性方程组,结果存储在X中,并通过disp函数打印出来。
运行代码后,可以得到x=2和y=1的解。
2. 求解非线性方程除了线性方程组外,MATLAB还可以用于求解非线性方程。
例如,我们可以使用"fzero"函数求解以下非线性方程:x^2 + 2x - 3 = 0代码如下所示:fun = @(x) x^2 + 2*x - 3;x0 = 0;x = fzero(fun, x0);disp(x);解释:上述代码定义了一个匿名函数fun,表示非线性方程。
然后,使用fzero函数传入fun和初始值x0来求解非线性方程的根,并通过disp函数打印出来。
运行代码后,可以得到x=1的解。
3. 绘制函数图像MATLAB提供了强大的绘图功能,可以帮助我们可视化函数的形状和特征。
例如,我们可以使用"plot"函数绘制以下函数的图像:y = cos(x)代码如下所示:x = linspace(0, 2*pi, 100);y = cos(x);plot(x, y);解释:上述代码首先使用linspace函数生成一个从0到2π的100个等间距点的向量x,然后计算对应的cos值,并存储在向量y中。
最后,使用plot函数将x和y作为横纵坐标绘制出函数图像。
运行代码后,可以看到cos函数的周期性波动图像。
matlab解方程的函数
matlab解方程的函数使用MATLAB解方程的函数MATLAB是一种强大的数学软件,具有许多用于解方程的函数。
这些函数可以帮助我们找到方程的解,并进一步分析和处理解的特性。
本文将介绍一些常用的MATLAB解方程函数,并通过几个例子来说明它们的使用方法。
1. fsolve函数fsolve函数是MATLAB中最常用的解方程函数之一。
它可以用于求解非线性方程组。
该函数的语法如下:x = fsolve(fun,x0)其中,fun是一个函数句柄,表示待求解方程组的函数,x0是一个初始猜测解的向量。
函数返回一个解向量x,它使得fun(x)的值接近于0。
例如,我们要求解方程组:sin(x) + y = 0x + 2*cos(y) = 0可以定义一个函数fun如下:function F = fun(x)F(1) = sin(x(1)) + x(2);F(2) = x(1) + 2*cos(x(2));end然后使用fsolve函数求解:x0 = [1;1];x = fsolve(@fun,x0);2. solve函数solve函数是MATLAB中用于求解代数方程的函数。
它可以用于求解多项式方程、代数方程组等。
该函数的语法如下:x = solve(eqn,var)其中,eqn是一个方程或方程组,var是待求解的变量。
函数返回一个解向量x,它使得方程eqn的值为0。
例如,我们要求解方程:x^2 + 2*x + 1 = 0可以使用solve函数求解:syms xeqn = x^2 + 2*x + 1 == 0;x = solve(eqn,x);3. eig函数eig函数是MATLAB中用于求解特征值和特征向量的函数。
它可以用于求解线性方程组的特征值和特征向量。
该函数的语法如下:[V,D] = eig(A)其中,A是一个矩阵,V是特征向量矩阵,D是特征值矩阵。
函数返回矩阵A的特征值和特征向量。
例如,我们要求解矩阵方程:A * x = lambda * x可以使用eig函数求解:A = [1 2; 3 4];[V,D] = eig(A);4. ode45函数ode45函数是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求解非线性方程组
1 引言
[x, fval, exitflag, output]=fsolve(…)返 回 一 个 包 含
非 线 性 方 程 组 解 的 几 何 意 义 与 线 性 方 程 最优化信息的输出结构 output。
组 类 似, 方 程 组 中 每 个 方 程 定 义 了 一 个“曲 ”超 [x, fval, exitflag, output, jacobian]=fsolve(… )返 回
4 迭代方法程序
数可以建立符号变量、表达式和矩阵。Matlab 的
一个多世纪以来, 迭代法一直被人们研
符 号 处 理 功 能 可 以 对 符 号 对 象 进 行 因 式 分 解 、 究、使用和发展。近些年来, 求解非线性方程组
替 换 、化 简 等 处 理 以 及 进 行 微 积 分 、求 极 限 、线 的迭代法越来越受到人们的重视, 并为许多计
f(x)及 x=f(t)、f(x)=0 构 成 的 参 数 曲 线 , ezpolar 可 迭代初值的选取方法, 三是证明迭代方法的保
以 绘 制 r=f(θ)的 极 坐 标 曲 线 , ezplot3 可 绘 制 y=f 正性, 还有一些经典迭代法和外推迭代法的最
(t)、x=f(t)、z=f(t)构 成 的 参 数 曲 线 , 还 有 ezsurf、 佳参数问题、在实际使用迭代法时如何建立可
平面, 非线性方程组的解为所有超平面的交点, 一个基于解的雅可比行列式 fun。
但是这些曲面可能相交, 也可能不相交, 情况比 求 解 方 程 之 前 , 需 要 建 立 一 个 m 程 序 定 义
平面复杂。通常对一个二维或三维没有解析解 “fun”, 即所求的非线性方程组,程序如下:
MATLAB求解非线性方程
第二步:求解[x,y,z,...]=solve('eqn1','eqn2',...,'eqnN','var1','var2',...'varN');
第三步:求出n位有效数字的数值解x=vpa(x,n);y=vpa(y,n);z=vpa(z,n);...。
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^2 + x*y + y = 3
x^2 - 4*x + 3 = 0
解法:
>> [x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0')
运行结果为
x =
1 3
y =
1 -3/2
即x等于1和3;y等于1和-1.5
或
>>[x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3= 0','x','y')
2、变参数非线性方程组的求解
matlab vpasolve用法
Vpasolve 是MATLAB 中用于求解非线性方程或方程组的符号解的函数。
它的调用方式如下:
1. 格式一:vpasolve(eqn),其中eqn 是符号方程。
这是默认求解变量由symvar(eqn) 求得。
2. 格式二:vpasolve(eqn, var),其中eqn 是符号方程,var 为需要求解的变量。
3. 格式三:vpasolve(eqn, var, init_guess),其中init_guess 为搜索初值。
4. 格式四:vpasolve(___, Name, Value),其中Name, Value 为一些选项控制。
使用vpasolve 求解问题时,需要注意以下几点:
1. vpasolve 最大的一个优点就是不需要提供初值,且能够自动搜索指定范围内的多个解。
2. 如果要使用vpasolve 函数,需要先安装并导入Symbolic Math Toolbox。
3. 在使用vpasolve 函数之前,需要先将方程转化为符号计算问题,并使用符号计算引擎来求解方程。
这可以通过将方程转化为符号表达式来实现。
4. Vpasolve 函数可能不适用于所有类型的方程或方程组,因此
需要根据具体情况选择适当的求解方法。
5. Vpasolve 函数可能存在一些局限性,例如在处理大规模问题或者特定类型的问题时可能会遇到困难。
因此,在使用vpasolve 函数时,需要充分了解其使用方法和适用范围,并根据具体情况选择适当的求解方法。
matlab fsolve函数用法 -回复
matlab fsolve函数用法-回复题目:matlab fsolve函数的用法摘要:本文主要介绍了matlab中的fsolve函数的用法。
fsolve函数是用于解决非线性方程组的工具,在各个科学领域都有广泛的应用。
本文将详细讲解fsolve函数的基本语法、输入参数和输出结果,以及如何应用该函数解决实际问题。
一、引言在科学研究和工程应用中,经常需要求解非线性方程组。
非线性方程组的解析解往往难以求得,因此需要借助计算工具进行数值求解。
matlab提供了多种求解非线性方程组的函数,其中fsolve函数是一种常用的工具。
二、fsolve函数的基本语法fsolve函数的基本语法如下:[x,fval,exitflag,output,jacobian] = fsolve(fun,x0,options)其中,fun是一个函数句柄,x0是初始解向量,options是一个结构体,用于设置求解的选项。
fsolve函数的返回值有多个,其中x是方程组的解向量,fval是方程组的函数值,exitflag是求解的退出标志,output是求解过程的输出信息,jacobian是雅可比矩阵。
三、输入参数的详细说明:1. fun:fun是一个函数句柄,用于定义需要求解的非线性方程组。
fun函数的输入参数是一个向量x,输出参数是方程组的函数值向量。
例如,对于一个二元非线性方程组,fun函数的定义如下:function F = fun(x)F = [x(1)^2 + x(2)^2 - 1;x(1)^2 - x(2)];end2. x0:x0是一个初始解向量,用于fsolve函数的初始估计。
3. options:options是一个结构体,用于设置fsolve函数的选项。
可以通过optimset函数创建options结构体,然后设置其中的字段值。
四、输出结果的详细说明:1. x:x是方程组的解向量,即使得方程组函数值最接近零的解。
2. fval:fval是方程组的函数值,即fun函数的输出结果。
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)。
7.2 求解非线性方程 f ( x ) = 0
方程求根的一般形式是求下列方程的根: f(x)=0 (l) 实际上,就是寻找使函数 f ( x)等于零的变量 x,所以求方程(l)的根,
也叫求函数 f ( x)的零点。如果变量 x 是列阵,则方程(l)就代表方程组。 当方程(l)中的函数 f (x)是有限个指数、对数、三角、反三角或幂函数 的组合时,则方程(l)被称为超越方程,例如 e-x - sin(πx / 2 ) +lnx = 0 就是 超越方程。 = anxn + an-1xn + … 当方程 (l) 中的函数 f (x) 是多项式时, 即 f (x) =P( n x) + alx + a0,则方程(l)就成为下面的多项式方程,也称代数方程: Pn(x)= anxn + an-1xn + … + alx + a0 = 0 (2) Pn(x)的最高次数 n 等于 2、3 时,用代数方法可以求出方程(2)的解析 解,但是,当 n ≥ 5 时,伽罗瓦(Galois)定理已经证明它是没有代数求根方法 的。至于超越方程,通常很难求出其解析解。所以,方程(l)的求解经常使用 作图法或数值法,而计算机的发展和普及又为这些方法提供了广阔的发展前景, 使之成为科学和工程中最实用的方法之一。 本章首先介绍求解 f ( x ) = 0 的 MATLAB 符号法指令, 然后介绍求方程数 值解的基本原理,最后再介绍求解 f ( x ) = 0 的 MATLAB 数值法指令。 一、符号方程求解 在 MATLAB 中,求解用符号表达式表示的代数方程可由函数 solve 实现, 其调用格式为: solve(s):求解符号表达式 s 的代数方程,求解变量为默认变量。 当方程右端为 0 时,方程可以不标出等号和 0,仅标出方程的左端。 solve(s,v):求解符号表达式 s 的代数方程,求解变量为 v。 solve(s1,s2,…,sn,v1,v2,…,vn):求解符号表达式 s1,s2,…,sn 组成的代数方程 组,求解变量分别 v1,v2,…,vn。 例 1. 解下列方程。 1 4x 2 2 1 1. x2 x 4 x2 x= solve('1/(x+2)+4*x/(x^2-4)=1+2/(x-2)', 'x') 2. x 3 x 3 4 x 7 1 f=sym('x-(x^3-4*x-7)^(1/3)=1') x= solve(f)
P=[3, 5, 0, -8, 1, -5]; Q=[10, 5, 0, 0, 6, 0, 0, 7, -1, 0, -100]; [p,q]=polyder(P,Q) 六、多项式求根
%有理分式分子 %有理分式分母
多项式求根就是求满足多项式 p(x)=0 的 x 值。N 次多项式应该有 n 个根。 这些根可能是实根,也可能是若干对共轭复根。其调用格式是 x=roots(P) 其中 P 为多项式的系数向量,求得的根赋给向量 x,即 x(1),x(2),…,x(n)分别 代表多项式的 n 个根。 该命令每次只能求一个一元多项式的根,该指令不能用于求方程组的解,必 须把多项式方程变成 Pn (x) = 0 的形式; 例 4 求方程 x 3 x 2 1 的解。 首先将方程变成 Pn (x) = 0 的形式: x 3 x 2 1 0 roots([1 -1 0 -1]) 例 5 求多项式 x4+8x3-10 的根。 A=[1,8,0,0,-10]; x=roots(A) 若已知多项式的全部根,则可以用 poly 函数建立起该多项式,其调用格式 为: P=poly(x) 若 x 为具有 n 个元素的向量,则 poly(x)建立以 x 为其根的多项式,且将该 多项式的系数赋给向量 P。 例 6 已知 f(x)=3x5+4x3-5x2-7.2x+5 (1) 计算 f(x)=0 的全部根。 (2) 由方程 f(x)=0 的根构造一个多项式 g(x),并与 f(x)进行对比。 P=[3,0,4,-5,-7.2,5]; X=roots(P) %求方程 f(x)=0 的根 G=poly(X) %求多项式 g(x) 将这个结果乘以 3,就与 f(x)一致
a n bn 作为方程根的近似值,它 2
满足 f ( xn)≈0 ,于是有:
xn x *
1 ba ba n 1 2 2n 2
这就是近似值 xn 的绝对误差限。假定预先要求的误差为,由
出满足误差要求的最小等分次数 n。 下面是二分法的程序 function [c,err,yc] =bisect (f,a,b,delta) %Input - f is the function input as a string ‘f’ % - a and b are the left and right end points %. - delta is the tolerance %Output - c is the zero % - yc=f(c) % - err is the error estimate for c ya=feval (f,a); yb=feval (f,b); if ya*yb>0, break, end %表示无解,结束 maxl=l+round( (log (b-a) -log (delta))/log (2)); %从误差表达式得到最小等分次数 n for k=1:max1 c=(a+b)/2; %取区间中点 yc=feval (f,c); if yc==0 a=c; b=c; %这时解已经找到 elseif yb*yc>0 b=c; %区间减半 yb=yc; else a=c; ya=yc; end if b-a < delta, break, end end c=(a+b)/2; err=abs(b-a); yc=feval (f, c)
① 函数 f (x)在[ a , b]上单调、连续; ② 方程 f (x) = 0 在(a , b)内只有一个实根 x*。 则求方程 f (x) = 0 的根,就是在(a, b)内找出使 f (x)为零的点 x*:f (x*) = 0 , 即求函数 f ( x ) 的零点。因为 f (x)单调连续,由连续函数的性质可知,若任意 两点 aj,bj[ a , b] ,而且满足条件 f (aj) f (bj) < 0 ,则闭区间[aj , bj] 上必然存 在方程的根 x*,即 x*[aj , bj]。 据此原理提出求实根的二分法如下图所示,
图 1 方程求根二分法原理示意图 ab 先用中点 b1 将区间[a, b]平分为两个子区间 (a,b1)和(b1, b),方程的 2 根必然在子区间两端点上函数值之积小于零的那一半中,即不在(a ,b1)内,就在 (b1 ,b )内,除非 f(b1) = 0 ,于是寻根的范围缩小了一半。图 1 中的根 x*在区间 中点左侧,即 x*(a , bl) 。再将新的含根区间( a , b1)分成两半,重复上述步骤 确定出更新的含根子区间。如此重复 n 次,设含根区间缩小为(an, bn) ,则方程 的根 x*(an, bn), 这一系列含根的子区间满足: ( a , b ) D ( al , bl ) ( a2 , b2 ) … ( a0, b0) … ba 由于含根区间范围每次减半,子区间的宽度为 bn a n n (n = 1,2,….),显然 2 当 n→时,(bn 一 an)→0,即子区间收敛于一点 x*,这个点就是方程的根。若 n 为有限整数,取最后一个子区间的中点 x n
第 7 章 求解非线性方程
7.1 多项式运算在 MATLAB 中的实现
一、多项式的表达 n 次多项式表达为: p(x) a 0 x n a 1 x n -1 a n -1 x a n ,是 n+1 项之和 在 MATLAB 中,n 次多项式可以用 n 次多项式系数构成的长度为 n+1 的行 向量表示 [a0, a1,……an-1,an] 二、多项式的加减运算 设 有 两 个 多 项 式
ba 便可以求 2 n 1
2 迭代法 迭代法是计算数学中的一种重要方法,用途很广,求解线性方程组和矩阵特 征值时也要用到它。 这里结合非线性方程的迭代法求解, 介绍一下它的基本原理。 迭代法基本原理 迭代法的基本原理就是构造一个迭代公式, 反复用它得出一个逐次逼近方程 根的数列,数列中每个元素都是方程根的近似值,只是精度不同。 迭代法求解方程
f(x)=0 (1) 时,先把方程等价地变换成形式 f ( x ) = x-g(x) = 0 , (2) 移项得出: x = g(x) (3) 若函数 g (x)连续,则称(3)为迭代函数。用它构造出迭代公式: xk+1= g ( xk) , k = 0 , l , 2 , … (4) 从初始值 x0 出发,便可得出迭代序列: { x k }= x0, x1, x2,….xk,….. ( 5 ) 如果迭代序列(5 )收敛,且收敛于 x*,则由式(4)有:
p1(x) a 0 x n a 1 x n -1 a n -1 x a n
和
p2(x) b 0 x m b1 x m -1 b m -1 x bm 。 它们的加减运算实际上就是它们的对应系
数的加减运算。 当它们的次数相同时,可以直接对多项式的系数向量进行加减运 算。当它们的次数不同时,应该把次数低的多项式无高次项部分用 0 系数表示。 例 2 计算 x 3 2 x 2 5 x 3 6 x 1 a=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b 例 3 设 f x 3x 5 5 x 4 2 x 3 7 x 2 5 x 6 , 求 f(x)+g(x) g x 3x 2 5 x 3 , 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 的导函数