matlab解非线性超定方程组-恰定方程组-欠定方程组.docx
Matlab解非线性超定方程组 3x+2/(5+y)=6, 4x+4/(5+y)=7, 9x+4/(8+y)=12 11x+2/(4+y)=15 x,y是未知数 -------------------- clc;clear; %其实楼主的问题可以等效为求最小值的问题,我使用的指标是典型的平方和最 小 xtt=[1,1]; f=@(x)(3*x(1)+2/(5+x(2))-6)^2+(4*x(1)+4/(5+x(2))- 7)^2+(9*x(1)+4/(8+x(2))-12)^2+(11*x(1)+2/(4+x(2))-15)^2; [x,fval]=fminsearch(f,xtt) ============================================================================== 求解线性方程组 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 超定方程,寻求最小二乘解; mm。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数据的 曲线拟合。对于超定方程,在 MATLAB 中,利用左除命令(x=A\b)来寻求它 的最小二乘解;还可以用广义逆来求,即 x=pinv(A),所得的解不一定满足 Ax=b,x 只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上, 由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行 householder 变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快; 【例 7】 求解超定方程组 A=[2 -1 3;3 1 -5;4 -1 1;1 3 -13] A= 2 -1 3 3 1 -5 4 -1 1 1 3 -13 b=[3 0 3 -6]’; rank(A) ans= 3 x1=A\b x1= 1.0000 2.0000 1.0000 x2=pinv(A)*b x2= 1.0000 2.0000 1.0000 A*x1-b ans=1.0e-014 -0.0888 -0.0888 -0.1332 0 可见 x1 并不是方程 Ax=b 的精确解,用 x2=pinv(A)*b 所得的解与 x1 相同。 三.欠定方程组 欠定方程组未知量个数多于方程个数,但理论上有无穷个解。MATLAB 将寻求 一个基本解,其中最多只能有 m个非零元素。特解由列主元 qr 分解求得。 【例 8】 解欠定方程组 A=[1 -2 1 1;1 -2 1 -1;1 -2 1 5] A= 1 -2 1 1 1 -2 1 -1 1 -2 1 -1 1 -2 1 5 b=[1 -1 5]’ x1=A\b Warning:Rank deficient,rank=2 tol=4.6151e-015 x1= 0 -0.0000 0 1.0000 x2=pinv(A)*b x2= 0 -0.00000.0000 1.0000 四.方程组的非负最小二乘解 在某些条件下,所求的线性方程组的解出现负数是没有意义的。虽然方程组可 以得到精确解,但却不能取负值解。在这种情况下,其非负最小二乘解比方程 的精确解更有意义。在 MATLAB 中,求非负最小二乘解常用函数 nnls,其调用 格式为: (1)X=nnls(A,b)返回方程 Ax=b 的最小二乘解,方程的求解过程被限制在 x 的条件下; (2)X=nnls(A,b,TOL)指定误差 TOL 来求解,TOL 的默认值为 TOL=max(size(A))*norm(A,1)*eps,矩阵的-1 范数越大,求解的误差越大; (3)[X,W]=nnls(A,b) 当 x(i)=0 时,w(i)0 时,w(i)0,同时返回一 个双向量 w。 【例 9】求方程组的非负最小二乘解 A=[3.4336 -0.5238 0.6710 -0.5238 3.2833 -0.7302 0.6710 -0.7302 4.0261]; b=[-1.000 1.5000 2.5000]; [X,W]=nnls(A,b) X= 0 0.6563 0.6998 W= -3.6820 -0.0000 -0.0000 x1=A\b x1=