第3章矩阵、数组和符号运算 7、符号方程求解 a线性方程组的符号解法 函数命令 linsolve用来求解线性方程组符号解。 对方程A*X=B, linsolve的调用格式为: X= linsolve(A,B)等同于X=sym(A)lsm(B) 10-10 > linsolve(A, B) A=-110-2 B=7 ans 0-210 4731475] 91/95 >2A=sm(1001020210m)(3764751 A > vpa( ans, 6) [10,-1,0 ans -1,10,-2] 995789] [0,-2,10 957895 >>B=([9;76]) 791579 B 矩阵A必须至少是行满秩的。当A的列数大于 9;76] 行数时,将给出解不惟一的警告提示
第3章 矩阵、数组和符号运算 7、符号方程求解 a.线性方程组的符号解法 函数命令 linsolve 用来求解线性方程组符号解。 对方程A*X=B,linsolve 的调用格式为: X = linsolve(A,B) 等同于 X = sym(A)\sym(B) >> A=sym('[10,-1,0;-1,10,-2;0,-2,10]') A = [ 10, -1, 0] [ -1, 10, -2] [ 0, -2, 10] >> B=('[9;7;6]') B = [9;7;6] − − − − = 0 2 10 1 10 2 10 1 0 A = 6 7 9 B >> linsolve(A,B) ans = [ 473/475] [ 91/95] [ 376/475] >> vpa(ans,6) ans = [ .995789] [ .957895] [ .791579] 矩阵 A 必须至少是行满秩的。当 A 的列数大于 行数时,将给出解不惟一的警告提示
第3章矩阵、数组和符号运算 b非线性方程的符号解法 用函数零点法求非线性方程的解有两个函数命令,即fero 和 sove。 fzero命令用于求一元函数零点 fsolve命令用于求解非线性方程组 首先需将方程f(x)=g(x)转化为F(x)=f(x)g(x)=0,方程组也 是如此;然后再将函数F(x)写成 MATLAB的m函数,以 便在fero和 fsolve命令中调用。 求解的过程为 先猜测一个初始零点,或者该零点大概所在的区间; 然后通过计算,使猜测值不断精确化,或使猜测区间不断 收缩,直到达到预先指定的精度为止
b. 非线性方程的符号解法 用函数零点法求非线性方程的解有两个函数命令,即fzero 和 fsolve。 fzero命令用于求一元函数零点 fsolve命令用于求解非线性方程组 首先需将方程 f(x)=g(x)转化为 F(x)=f(x)-g(x)=0,方程组也 是如此 ;然后再将函数 F(x)写成 MATLAB 的 m 函数,以 便在 fzero 和 fsolve 命令中调用。 求解的过程为: ▪先猜测一个初始零点,或者该零点大概所在的区间; ▪然后通过计算,使猜测值不断精确化,或使猜测区间不断 收缩 ,直到达到预先指定的精度为止。 第3章 矩阵、数组和符号运算
第3章矩阵、数组和符号运算 求一元函数零点命令ero的调用格式为: ◆x= fzero(iun,x0):求一元函数零点命令的最简形式; ◆〖x,val, exitflagl= fzero(fun,x0, options, P1,P2,):求一元函 数零点命令的完整格式。 x0是初始猜测的零点; options是优化迭代所采用的参数选项, options的缺省设置可以用命令 options= soptimset(' fzero)获得; P1,P2是向函数fu传递的附加参数。它的具体取名和函数fun中 致 "x是输出参数,为所求的零点自变量值 val是输出参数,为函数fu在x处的值; exitflag是描述函数fun的退出情况。若 exitflag>0,则表示找到函数 零点后退出;若 exitflag-<0,则表示没有找到零点或在搜索过程中遇到 了无穷大的函数值
第3章 矩阵、数组和符号运算 求一元函数零点命令fzero 的调用格式为: ◆ x = fzero(fun,x0):求一元函数零点命令的最简形式; ◆ [x,fval,exitflag] =fzero(fun,x0,options,P1,P2,...):求一元函 数零点命令的完整格式。 ▪x0 是初始猜测的零点; ▪options 是优化迭代所采用的参数选项,options的缺省设置可以用命令 options=optimset(’fzero’)获得; ▪P1,P2是向函数 fun 传递的附加参数。它的具体取名和函数 fun 中一 致; ▪x是输出参数,为所求的零点自变量值; ▪fval是输出参数,为函数fun 在 x 处的值; ▪exitflag是描述函数 fun 的退出情况。若 exitflag>0,则表示找到函数 零点后退出;若 exitflag<0,则表示没有找到零点或在搜索过程中遇到 了无穷大的函数值
第3章矩阵、数组和符号运算 用fero命令求解函数f(x)=x-4=5的零点 (1)建立函数f(x)的M文件。 D④日母AA function y=funl(x) y=x^4-4*x5; (2)建立水平横轴的M文件。 function y=fun(x) V=0 (3)用作图法估计函数零点位置 > fplot('funI, [-5, 5],r,) >> hold on > fplot('fun2, -5, 5],r,) t y ha tt nram D日A国 (4)用z00m和 input命令获得零点的初始近似值 在程序中输入下列命令,可得到函数的局部放大图及鼠标 操作线。 zoom on %局部放大命令 [tt]=input(1) Iy}= input(1)%用鼠标获取2个零点猜测值 zoom off %恢复原来图形大小
第3章 矩阵、数组和符号运算 用 fzero 命令求解函数 的零点 ( 1)建立函数 f(x)的 M 文件。 function y=fun1(x) y=x.^4-4*x-5; ( 2)建立水平横轴的 M文件。 function y=fun2(x) y=0; ( 3)用作图法估计函数零点位置。 >> fplot('fun1',[-5,5],'r') >> hold on >> fplot('fun2',[-5,5],'r') ( 4)用 zoom 和 ginput 命令获得零点的初始近似值 在程序中输入下列命令,可得到函数的局部放大图及鼠标 操作线。 zoom on %局部放大命令 [tt]=ginput(1) [yy]=ginput(1) %用鼠标获取 2 个零点猜测值 zoom off %恢复原来图形大小 ( ) 4 5 4 f x = x − x −
第3章矩阵、数组和符号运算 显示所得零点初始猜测值,结果为 0.98380.0001 1.87620.0091 (5)用函数 fzero命令求函数的精确零点 [ fval, exitflag}- fzero('funl't(1))%靠近t(1)点处的精确零点 fval, exitflag}= fzero('fun1,y(1))%靠近yy(1)点处的精确零点 结果为: Zero found near tt Zero found near yy 812 fval fva -6.2172e-015 exitflag exitflag
显示所得零点初始猜测值,结果为: tt = -0.9838 0.0001 yy = 1.8762 0.0091 (5)用函数 fzero 命令求函数的精确零点 [x,fval,exitflag]=fzero(’fun1’,tt(1),[]) %靠近 tt(1)点处的精确零点 [x,fval,exitflag]=fzero(’fun1’,yy(1),[]) %靠近 yy(1)点处的精确零点 结果为: Zero found near tt. x = -1 fval = 0 exitflag = 1 第3章 矩阵、数组和符号运算 Zero found near yy. x = 1.8812 fval = -6.2172e-015 exitflag = 1
第3章矩阵、数组和符号运算 解非线性方程组的函数命令 fsolve 其调用格式为: ◆x= fsolve(fun,x0):解非线性方程组最简单的调用格式 该式中除两个输入参数外,其余输入输出参数都可以缺省; ◆x, fval, exitflag, output, jacob}= fsolve(funx0, options,P1,P2…):解非 线性方程组最完整的调用格式 x0是表示零点数是猜测值的向量; options是优化迭代所采用参数的结构数组。 P1和P2是向函数fun传递的参数; x和fval是输出参数,所求零点的自变量值和函数值; output是输出此命令所用的计算方法、迭代次数等信息。 jaob是函数在x处的 jacobian
解非线性方程组的函数命令fsolve 其调用格式为: ◆ x=fsolve(fun,x0) :解非线性方程组最简单的调用格式。 该式中除两个输入参数外,其余输入输出参数都可以缺省; ◆ [ x,fval,exitflag,output,jacob]=fsolve(fun,x0,options,P1,P2...): 解 非 线性方程组最完整的调用格式。 ▪x0 是表示零点数是猜测值的向量; ▪options 是 优 化 迭 代 所 采 用 参 数 的 结 构 数 组 。 ▪P1 和 P2是向函数fun 传递的参数; ▪x 和 fval是输出参数,所求零点的自变量值和函数值; ▪output是输出此命令所用的计算方法、迭代次数等信息。 ▪jacob是函数在x 处的 jacobian。 第3章 矩阵、数组和符号运算
第3章矩阵、数组和符号运算 求方程组x1-07mx1-02csx2=0的根。 x2-0.7cos xl+0.2sin x2=0 首先编制函数文件fcm function y=fc(x y(1)=x(1)-0.7*sin(x(1)-02*sin(x(2) y(2)=x(2)-0.7*c0s(X(1)+0.2*sin(x(2) output y=y1)y(2 firstorderopt: 5.7877e-009 然后用 fsolve求解 iterations: 5 >x, fval, exitflag, output, jacob]=fsolve(fc,[1, 1.,D) unc Count: 16 %,1为初值 iterations: 4 algorithm: [1x43 char 0.33670.5553 Jacob fval (1,1)0.393 1.0e-008* (2,1)0.2313 0.20290.5242 (1,2)-0.1700 exitflag (2,2)1.1700
第3章 矩阵、数组和符号运算 求方程组 的根。 首先编制函数文件fc.m function y=fc(x) y(1)=x(1)-0.7*sin(x(1))-0.2*sin(x(2)); y(2)=x(2)-0.7*cos(x(1))+0.2*sin(x(2)); y=[y(1),y(2)]; 然后用fsolve求解 >>[x,fval,exitflag,output,jacob]=fsolve(‘fc’, [1.,1.],[]) %[1.,1.]为初值 x = 0.3367 0.5553 fval = 1.0e-008 * 0.2029 0.5242 exitflag = 1 − + = − − = 2 0.7cos 1 0.2sin 2 0 1 0.7sin 1 0.2cos 2 0 x x x x x x output = firstorderopt: 5.7877e-009 iterations: 5 funcCount: 16 cgiterations: 4 algorithm: [1x43 char] jacob = (1,1) 0.3393 (2,1) 0.2313 (1,2) -0.1700 (2,2) 1.1700
第3章矩阵、数组和符号运算 求方程组Smx+y=0的解 x+6y=0 初始零点猜测值为:[x0y01=00.0058 用 fsolve函数命令求精确解 fun=sin(x(1)+x2)x(1)+6*x(2);%用字符串表达式形式命令。 注意自变量必须写成x(1)和x(2) fun函数也可用M函数文件的形式 function yy=fun(x) y(l=sin(x(1))+x(2); y(2)=x(1)+6*x(2); [XXYY]= solver( fun, XO(1)y0())%解此非线性方程组 XX 10e016* -0.54640.1214 YY 10e-016* -042500.1821
求方程组 的解。 初始零点猜测值为:[x0,y0]=[0.0, -0.0058] 用fsolve 函数命令求精确解 fun=’[sin(x(1))+x(2),x(1)+6*x(2)]’; %用字符串表达式形式命令。 注意自变量必须写成x(1)和x(2) fun 函数也可用M 函数文件的形式 function yy=fun(x) yy(1)=sin(x(1))+x(2); yy(2)=x(1)+6*x(2); [XX,YY]=fsolve(fun,[x0(1),y0(1)]) %解此非线性方程组 XX = 1.0e-016 * -0.5464 0.1214 YY = 1.0e-016 * -0.4250 0.1821 + = + = 6 0 sin 0 x y x y 第3章 矩阵、数组和符号运算
第3章矩阵、数组和符号运算 c.一般代数方程(组)的符号解 slove命令可以解一般代数方程,包括线性方程、非线性方程和超越方 程。当方程不存在符号解,且又无其他自由参数时,函数 solve将给出 数值解。 命令调用格式为: soleen1’,eqn2,,eqnN):对N个方程的默认变量求解; > solve(eqn’eqn2…,eqnN',’varl,var2,,warN):对N个方程的 varl,war2,,arN变量求解。要注意变量的英文字母顺序,且在变量前 不可有空格 >S=sole(eqn1,eqn2,,eqnN,’var1,’var2,…,varN):对N个方程 的’var2,,’varN“变量求解;S是一个结构数组; x1,x2,…,xn}= solve(eqn1',eqn2,…,eqnN,var1',var2…,varN):对 变量varl,yar2灬…, varN求解,求解的结果分别赋给x1,x2,,xn(按照变 量varl,war2,varN在英文字母中的顺序给x1,x2,,xn赋值)
第3章 矩阵、数组和符号运算 c.一般代数方程(组)的符号解 slove 命令可以解一般代数方程,包括线性方程、非线性方程和超越方 程。当方程不存在符号解,且又无其他自由参数时,函数 solve 将给出 数值解。 命令调用格式为: ➢solve(’eqn1’,’eqn2’,...,’eqnN’):对N 个方程的默认变量求解; ➢solve(’eqn1’,’eqn2’,...,’eqnN’,’var1,var2,...,varN’): 对 N 个 方 程 的 var1,var2,...,varN 变量求解。要注意变量的英文字母顺序,且在变量前 不可有空格; ➢S=solve(’eqn1’,’eqn2’,...,’eqnN’,’var1’,’var2’,...,’varN’):对 N 个方程 的’var2’,...,’varN‘变量求解;S是一个结构数组; ➢[x1,x2,…,xn]=solve(‘eqn1’,‘eqn2’,...,‘eqnN’,‘var1’,‘var2’,...,‘varN’):对 变量 var1,var2,..., varN 求解,求解的结果分别赋给 x1,x2,…,xn(按照变 量var1,var2,...varN 在英文字母中的顺序给x1,x2,…,xn赋值)
第3章矩阵、数组和符号运算 x2+√2x+2=0 求非线性方程组x+32=4的解。 解: [x, y, z=solve( 2+sqrt(2)*x+2=0, x+3*4=4, y*Z-1,'x,yl,z) X [(-1/2+1/2*i*3^(12)*2^(12) [(-1/2-1/2*i*3^(1/2)*2^(1/2) [-51/73+3/73*1*3^(1/2)-27/146*(-12+112*1*3^(12)*2^(12)-3/146*2^(12 [-5173-373*i*3^(12)-27/146*(-1/2-1/2*1*3~(112)*2(12)-3/146*2(12 = [-1/3*(-12+1/2*1*3^(1/2)*2^(112)+4/3 [-1/3*(-1/2-12*1*3^(12)*2~1/2)+43]
第3章 矩阵、数组和符号运算 求非线性方程组 的解。 解: [x,y,z]=solve('x^2+sqrt(2)*x+2=0','x+3*z=4','y*z=-1','x','y','z') x = [ (-1/2+1/2*i*3^(1/2))*2^(1/2)] [ (-1/2-1/2*i*3^(1/2))*2^(1/2)] y= [-51/73+3/73*i*3^(1/2)-27/146*(-1/2+1/2*i*3^(1/2))*2^(1/2)-3/146*2^(1/2)] [ -51/73-3/73*i*3^(1/2)-27/146*(-1/2-1/2*i*3^(1/2))*2^(1/2)-3/146*2^(1/2)] z = [ -1/3*(-1/2+1/2*i*3^(1/2))*2^(1/2)+4/3] [ -1/3*(-1/2-1/2*i*3^(1/2))*2^(1/2)+4/3] = − + = + + = 1 3 4 2 2 0 2 yz x z x x