MATLAB在化工中的应用 非线性方程(组)求解与迭代法
MATLAB在化工中的应用 -第一讲 简介与基本数学运算 2

命令历史
Matlab的通用命令
命令
cd type clf clc hold path load quit whos
命令说明
显示或改变工作目录 显示文件内容 清除图形窗口 清除命令窗口内容 图形保持开关 显示搜索目录 加载指定文件变量 退出Matlab 变量查看
命令
dir clear pack echo disp save diary !
Crtl+U,Esc
Crtl+K
删除一行
从光标删除至行 末
数学函数(elfun)
类型
三角函数
函
sin(x) asin(x) cos(x)
数
正弦值 反正弦值 余弦值 反余弦值
含
义
acos(x)
tan(x)
指数函数 exp(x) log(x)
正切
指数运算 自然对数
sqrt(x)
复数函数 abs(x) imag(x) real(x) conj(x) 数论函数 round(x) mod(x,y) lcm(x,y) gcd(x,y)
命令的窗口的快捷键
快捷键 作用 快捷键 作用
↑,Crtl+P
↓,Crtl+N ←,Crtl+B
回调上一行
回调下一行 回移上一字符
Crtl+→
Crtl+A,Home Crtl+E,End
右移一单词
移至行首 移至行末
→,Crtl+F
Crtl+← Ctrl+C
前移下一字符
左移一单词 终止正在运行的 程序
MATLAB数据类型
• • • • • 数值(标量,向量,数组) 字符串 单元数组(cell array) 结构体(structure) 函数句柄
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实现首先,我们需要定义非线性方程组。
假设我们要求解方程组:```f1(x1,x2)=0f2(x1,x2)=0```其中,`x1`和`x2`是未知数,`f1`和`f2`是非线性函数。
我们可以将这个方程组表示为向量的形式:```F(x)=[f1(x1,x2);f2(x1,x2)]=[0;0]```其中,`F(x)`是一个列向量。
为了实现牛顿迭代法,我们需要计算方程组的雅可比矩阵。
雅可比矩阵是由方程组的偏导数组成的矩阵。
对于方程组中的每个函数,我们可以计算其对每个变量的偏导数,然后将这些偏导数组成一个矩阵。
在MATLAB中,我们可以使用`jacobi`函数来计算雅可比矩阵。
以下是一个示例函数的定义:```matlabfunction J = jacobi(x)x1=x(1);x2=x(2);J = [df1_dx1, df1_dx2; df2_dx1, df2_dx2];end```其中,`x`是一个包含未知数的向量,`df1_dx1`和`df1_dx2`是`f1`对`x1`和`x2`的偏导数,`df2_dx1`和`df2_dx2`是`f2`对`x1`和`x2`的偏导数。
下一步是实现牛顿迭代法。
牛顿迭代法的迭代公式为:```x(k+1)=x(k)-J(x(k))\F(x(k))```其中,`x(k)`是第`k`次迭代的近似解,`\`表示矩阵的求逆操作。
在MATLAB中,我们可以使用如下代码来实现牛顿迭代法:```matlabfunction x = newton_method(x_initial)max_iter = 100; % 最大迭代次数tol = 1e-6; % 收敛阈值x = x_initial; % 初始解for k = 1:max_iterF=[f1(x(1),x(2));f2(x(1),x(2))];%计算F(x)J = jacobi(x); % 计算雅可比矩阵 J(x)delta_x = J \ -F; % 计算增量 delta_xx = x + delta_x; % 更新 xif norm(delta_x) < tolbreak; % 达到收敛条件,停止迭代endendend```其中,`x_initial`是初始解的向量,`max_iter`是最大迭代次数,`tol`是收敛阈值。
matlab求解非线性方程组迭代的算例

解:设Na t =,Jh x =,原地基梁根据差分方法可以化为Nn Jj na na w w w w w w J w w w a n j n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin(1)464()2(13,3,2,1,,1,2441,,1,2===++-+-++---++-+πππ将其变形为Nn Jj J a m na na a w w w w mw w m w a w n j n j n j n j n j n j n j n j ,...,0,...,0)5sin()sin()4)26(4(44221,,2,1,,1,23,321,===+-+--+---=---+++πππ可将其写为1][+n j w =n j w a ][332π-n j w S m ]][[-1][--n j w ])[5sin()sin(2E na na a π+ N n J j ,...,0,...,0==又利用边界条件,可得nn nJ n J n J nJ n J n J n J w w w w w w w w w ,1,1,1,,1,2,1,,2244=-=+-=--+--+而 J j J j w j ,...,0);/sin(0,==π利用以上方程便可代入进行迭代运算。
以下是matlab 程序:J=input('请输入J 值:');N=input('请输入N 值:');t=input('请输入t 值:');a=t/N;m=a^2*J^4/pi^4;S=zeros(J,J);S(1,1:3)=[7-2/m,-4,1];S(2,1:4)=[-4,6-2/m,-4,1];for i=1:J-4S(i+2,i:i+4)=[1,-4,6-2/m,-4,1];endS(J-1,J-3:J)=[1,-4,5-2/m,-2];S(J,J-2:J)=[2,-4,2-2/m];E=zeros(J,1);E(:,1)=1;W=zeros(J,N+2);for j=1:JW(j,1)=sin(pi*j/J);endW(:,2)=0.5*((-a^2/pi^3)*(W(:,1).^3)-m*S*W(:,1));for n=3:N+2W(:,n)=(-a^2/pi^3)*(W(:,n-1).^3)-m*S*W(:,n-2)-W(:,n-2)+(a^2)*sin(n*a)*sin(5*pi*n*a)*E;end根据差分格式的收敛性讨论可知,当2102≤<N t J 时,差分格式能够收敛。
Matlab在化工数值计算中的应用

Matlab 在化工数值计算中的应用(提纲) 基础知识Command Window 指令窗简介最简单的计算器使用方法加减乘除和幂运算符、矩阵的输入形式、常见表达式形式数值、变量和表达式数值的表示方法(十进制、科学记数)、变量命名规则(对大小写敏感,变量名的第一个字母必须为英文字母,不得含空格,但可含下划线链接符)、Matlab 默认的预定义变量(ans/inf/i 或j/pi/NaN 等)、复数和复数矩阵(把复数作为一个整体处理、real(z),imag(z),abs(z)/模,angle(z)/相角)。
例1:已知/612334,12,2i z i z i z e π=+=+=,并计算123/z z z z =计算结果的图形表示。
例2:画出衰减振荡曲线/3sin3t y e t -=及它的包络线并计算/30t y e -=。
t 的取值范围是[]04π, t=0:pi/80:4*pi; %定义自变量取值数组y0=exp(-t/3); %计算与自变量相应的y0数组y=exp(-t/3).*sin(3*t);%计算与自变量相应的y 数组plot(t,y,'-r',t,y0,':b',t,-y0,':b') %用不同颜色,不同线条绘制曲线数值计算结果的显示格式format/format short, format long, format short e, format long e, 标点符号的使用指令窗的常用控制指令clc, clear,edit, help, exit/quit, typeM 角本文件的编写与运算路径的制定帮助系统数值数组及其运算数组及其运算是Matlab 的核心内容2.1 一维数组的创建与赋值(逐个元素输入法、冒号生成法);2.2 二维数组的创建与复制(直接输入法)2.3 执行数组运算的常用函数三角函数、反三角函数、幂指对函数、复数函数(abs,angle,conj (共厄复数),imag,real)2.4 数组运算与矩阵运算A.’, A’,S./B,s*inv(B),A.^n,A^n,A.*B,A*B,A./B,A/B,f(A)注意运算符的小黑点。
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应用 求解非线性方程

第7章 求解非线性方程7.1 多项式运算在MATLAB 中的实现一、多项式的表达n 次多项式表达为:n a +⋯⋯++=x a x a x a p(x)1-n 1-n 1n 0,是n+1项之和 在MATLAB 中,n 次多项式可以用n 次多项式系数构成的长度为n+1的行向量表示[a0, a1,……an-1,an]二、多项式的加减运算 设有两个多项式na +⋯⋯++=x a x a x a p1(x)1-n 1-n 1n 0和m b +⋯⋯++=x b x b x b p2(x)1-m 1-m 1m 0。
它们的加减运算实际上就是它们的对应系数的加减运算。
当它们的次数相同时,可以直接对多项式的系数向量进行加减运算。
当它们的次数不同时,应该把次数低的多项式无高次项部分用0系数表示。
例2 计算()()1635223-+++-x x x xa=[1, -2, 5, 3]; b=[0, 0, 6, -1]; c=a+b例 3 设()6572532345++-+-=x x x x x x f ,()3532-+=x x x g ,求f(x)+g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; g1=[0, 0, 0, g];%为了和f 的次数找齐f+g1, f-g1三、多项式的乘法运算conv(p1,p2)例4 在上例中,求f(x)*g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; conv(f, g)四、多项式的除法运算[Q, r]=deconv(p1, p2)表示p1除以p2,给出商式Q(x),余式r(x)。
Q,和r 仍为多项式系数向量 例4 在上例中,求f(x)/g(x)f=[3, -5, 2, -7, 5, 6]; g=[3, 5, -3]; [Q, r]=deconv(f, g) 五、多项式的导函数p=polyder(P):求多项式P 的导函数 p=polyder(P,Q):求P ·Q 的导函数[p,q]=polyder(P,Q):求P/Q 的导函数,导函数的分子存入p ,分母存入q 。
用Matlab求解非线性方程组

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);若用户定义的值为矩阵,则会被自动转换为向量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本讲小结
sol=roots(C) [sol,feval,exitflag,output]=fzero(@fun ,x0,options,p1,p2,...) [sol,feval,exitflag,output,jacobian]=fs olve(@fun,x0,options,p1,p2,...)
fsolve函数的使用
sin x y 2 ln z 0 y 3 3x 2 z 1 0 x y z 5
function Cha2demo6 x0=[1 1 1]; x=fsolve(@fun,x0) function y=fun(x) y(1)=sin(x(1))+x(2)^2+log(x(3)); y(2)=3*x(1)+2^x(2)-x(3)^3+1; y(3)=x(1)+x(2)+x(3)-5; 解得结果如下:x=0.5991 2.3959
结果: The conversion could be 0.0408 0.0408 0.2804 0.2804 0.2804 0.2804 0.8363 0.8363 0.8363 0.8363 1.0951
fsolve函数
• 与fzero函数只能求解单个方程的根不同,fsolve函数可求 解非线性方程组的解。其算法采用的是最小二乘法。 • 调用格式: [x,fval,exitflag,output] = fsolve(fun,x0,options, p1, p2, ...) • 输入变量的意义同fzero函数。
function Cha2demo7 x0 = [0.05 0.2 0.01]; x = fsolve(@EquiC3,x0); CAC=x(3)/sum(x) if CAC<0.05 disp('The AC concentration could not be over 0.05%') else disp('The AC concentration could be over 0.05%') end function f = EquiC3(x) f1 = x(1)-0.064*(1-x(1)-x(2)-x(3)); f2 = x(2)*(x(2)+x(3))-0.076*(1-x(1)-x(2)-x(3))*(1+x(2)+x(3)); f3 = x(3)*(x(2)+x(3))-0.00012*(1-x(1)-x(2)-x(3))*(1+x(2)+x(3)); f = [f1 f2 f3]; 结果:The AC concentration could not be over 0.05%
aq=conv(a,q)
d=poly2sym(aq) e=deconv(aq,a)
%多项式乘法
%多项式向量表示为符号多项式 %多项式除法
f=polyder(e)
%多项式微分
多项式求根函数roots
求解方程:
2 x 4 5x 3 6 x 2 x 9 0
p=[2 -5 6 -1 9]; sol=roots(p) 结果: sol = 1.6024 + 1.2709i 1.6024 - 1.2709i -0.3524 + 0.9755i -0.3524 - 0.9755i
fzero函数初值对结果的影响
function Cha2demo4 T0 = 450; x0 = [0:0.1:1.0]; n=length(x0); for i=1:n x(i)= fzero(@NonlinEq,x0(i),[],T0); end disp('The conversion could be') fprintf('%.4f\t',x) fprintf('\n') % -----------------------------------------------------------------function f = NonlinEq(x,T0) T = T0 + 250*x; f = 0.25*(1-x)^2*exp(20-10000/T) - x;
an2 f (V ) ( p 2 )(V nb) nRT 0 V
非线性方程(组)在化学工程中的作用
•多组分混合溶液的沸点、饱和蒸气压计算
• 流体在管道中阻力计算
•多组分多平衡级分离操作模拟计算
•平衡常数法求解化学平衡问题
•定态操作的全混流反应器的操作分析
迭代法原理
不动点迭代: f ( x) 0 x ( x) 已知: 3 x 1 0 x 可以采用以下两种 迭代格式计算
4) x 3 2 x 5 0
fzero(@(x) x^3-2*x-5,1); roots([1 0 -2 -5])
fzero函数应用
an2 f (V ) ( p 2 )(V nb) nRT 0 V
P = 9.33; T = 300.2; n = 2; a = 4.17; b = 0.0371; R = 0.08206; V=fzero(@(V) P*V^3(P*n*b+n*R*T)*V^2+ a*n^2*解函数fzero
调用格式: [x,fval,exitflag,output] = fzero(fun,x0) 此函数的作用求函数fun在x0附件的零值点,x0是标量。 fval 函数在解x处的值 exitflag 程序结束情况,>0,程序收敛于解; <0,程序没有收敛;=0,计算达到 了最大次数 output 一个结构体,提供程序运行的信息; output.iterations,迭代次数; output.functions,函数fun的计算次数; output.algorithm,使用的算法 fun可以是函数句柄或匿名函数。
第二部分 非线性方程(组)求解与迭代法
本章知识要点
• 数值计算
– 单个非线性方程求解 – 非线性方程组求解 – 迭代法
• MATLAB
– 求解非线性方程(组)的相关函数
本章的所要解决的典型问题
在945.36kPa(9.33atm)、300.2K时,容器中充以 2mol氮气,试求容器体积。 已知此状态下氮气的P-V-T关系符合范德华方程,其 范德华常数为a=4.17atm•L/mol2,b=0.0371L/mol 数学模型:
fzero函数的使用
1) sinx在3附近的零点 2) cosx在[1,2]范围内的零点 3) x 2 sin x 0
3
fzero(@sin,3)
fzero(@cos,[1,2]) fzero(@(x) x^3-2*sin(x),1) 或者: function Cha2demo1 x=fzero(@fun,1) function y=fun(x) y=x^3-2*sin(x);
V=0.1092
fzero函数的应用
在945.36kPa(9.33atm)、300.2K时,容器中充以2mol氮气, 试求容器体积。 已知此状态下氮气的P-V-T关系符合范德华方程,其范德华常 数为a=4.17atm•L/mol2,b=0.0371L/mol
function PVT P = 9.33; % atm T = 300.2; % K n = 2; % mol a = 4.17; b = 0.0371; R = 0.08206; V0 = n*R*T/P [V,fval] = fzero(@PVTeq,V0,[],P,T,n,a,b,R) % -----------------------------------------------------------------function f = PVTeq(V,P,T,n,a,b,R) f = (P + a*n^2/V^2) * (V-n*b) - n*R*T;
2.0050
fsolve函数的应用
在铜管内在1 atm下将异丙醇加热到400℃。已知铜是生产丙酮和丙醛 的催化剂,或许还有某些异丙醇异构化为正丙醇。这三种产物的生成可 用如下三个独立反应表示: iC3H7OH(IP) = n C3H7OH(NP) K1 = 0.064 iC3H7OH(IP) = (CH3)CO(AC)+H2 K2 = 0.076 iC3H7OH(IP) = C2H5CHO(PR) +H2 K3 = 0.00012 后续加工步骤需要正丙醇,虽然可含丙酮,但丙醛含量不能超过 0.05(mol)%。在上述反应条件下,是否存在违反这种规定的可能性? 数学模型:各反应的化学平衡方程如下
an2 f (V ) ( p 2 )(V nb) nRT 0 V
P = 9.33; T = 300.2; n = 2; a = 4.17; b = 0.0371; R = 0.08206 coef=[P, -(P*n*b+n*R*T), a*n^2 , a*b*n^3]; V=roots(coef) 结果: V =5.0028 0.2429 0.1092
x1 0.064 1 x1 x 2 x 3
x2 ( x2 x3 ) 0.076 (1 x1 x 2 x 3 )(1 x 2 x 3 )
x3 ( x2 x3 ) 0.00012 (1 x1 x 2 x 3 )(1 x 2 x 3 )
迭代法意义示意图
3 xk 1 xk 1 xk 1 ( x 1)1/ 3
多项式函数
多项式:
P( x) ao x n a1 x n1 an1 x an
Matlab表达多项式方法: P [a0 , a1 ,, an1 , an ] Matlab多项式函数
– – – – – Polyval Polyder Polyfit Conv,Deconv Roots 多项式的值 多项式微分 多项式拟合 多项式乘法和除法 多项式求根