Matlab求解超定方程组实例
对于超定方程组,特别是非线性方程组,可以用Matlab基于最小二乘算法来进行求解,例如,求解下列方程组:
一个三个未知数,九个方程的非线性方程组:
cos(x3)*sin(x2)*sin(x1)-sin(x3)*cos(x1)=-0.9944 ; sin(x3)*sin(x2)*sin(x1)+cos(x3)*cos(x1)=-0.0870; cos(x2)*sin(x1)=-0.0606;
cos(x3)*sin(x2)*cos(x1)+sin(x3)*sin(x1)=0.0349; sin(x3)*sin(x2)*cos(x1)-cos(x3)*sin(x1)=-0.8085; cos(x2)*cos(x1)=0.5875; os(x3)*cos(x2)=-0.1001; sin(x3)*cos(x2)=0.5821; -sin(x2)=0.8070; 代码
% By lyqmath function main() clc; clear all; close all;
% cos(x3)*sin(x2)*sin(x1)-sin(x3)*cos(x1)=-0.9944 ; % sin(x3)*sin(x2)*sin(x1)+cos(x3)*cos(x1)=-0.0870; % cos(x2)*sin(x1)=-0.0606;
% cos(x3)*sin(x2)*cos(x1)+sin(x3)*sin(x1)=0.0349; % sin(x3)*sin(x2)*cos(x1)-cos(x3)*sin(x1)=-0.8085; % cos(x2)*cos(x1)=0.5875; % os(x3)*cos(x2)=-0.1001; % sin(x3)*cos(x2)=0.5821; % -sin(x2)=0.8070;
x0 = [0.3 0.4 0.5]
[x, resnorm] = lsqnonlin(@test_fun, x0) F = test_fun(x)
function F = test_fun(x) x1 = x(1); x2 = x(2); x3 = x(3);
F(1) = cos(x3)*sin(x2)*sin(x1)-sin(x3)*cos(x1)+0.9944 ; F(2) = sin(x3)*sin(x2)*sin(x1)+cos(x3)*cos(x1)+0.0870; F(3) = cos(x2)*sin(x1)+0.0606;
F(4) = cos(x3)*sin(x2)*cos(x1)+sin(x3)*sin(x1)-0.0349; F(5) = sin(x3)*sin(x2)*cos(x1)-cos(x3)*sin(x1)+0.8085; F(6) = cos(x2)*cos(x1)-0.5875; F(7) = cos(x3)*cos(x2)+0.1001; F(8) = sin(x3)*cos(x2)-0.5821; F(9) = -sin(x2)-0.8070; 结果 x0 =
0.3000 0.4000 0.5000
Local minimum found.
Optimization completed because the size of the gradient is less than the default value of the function tolerance.
-0.1028 -0.9390 1.7411
resnorm =
5.4490e-009 F =
1.0e-004 *
Columns 1 through 7
0.3522 0.1842 -0.0442 0.1487 0.2260 -0.0936 0.0183
Columns 8 through 9
-0.3600 -0.4160 >>
可以发现,误差在1.0e-004级别,还是可以接受的。