此方法一般适用于低阶稠密线性方程组。
一、利用左除的直接解法 对于Ax=b,变换后可得到x=A\b
示例代码如下
A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]’;
x=A\b`
二、利用矩阵的分解求解(这里介绍的是LU分解)
MATLAB提供的lu函数调用格式如下
1.[L,U]=lu(X);
%产生一个上三角阵U和一个变换形式的下三角阵L,使得X=LU
2.[L,U,P]=lu(X);
%P为置换矩阵,满足PX=LU
示例代码如下(利用LU分解来计算线性方程组)
A=[2,1,-5,1;1,-5,0,7;0,2,1,-1;1,6,-1,-4];
b=[13,-9,6,0]’;
[L,U]=lu(A);
x=U(L\b) %U与括号间还有个左除符号,不知道为什么无法显示
此方法一般用于求解大型稀疏矩阵,这里主要介绍的是Jacobi迭代法,对于方程组Ax=b,若A为非奇异方针,且主对角线元素都不为0,把A分解为A=D-L-U,D是对角矩阵,元素为A的对角元素,L与U为A的下三角矩阵取反和上三角矩阵取反,推导出迭代公式
y=B*x+f
function [y,n]=jacobi(A,b,x0,ep)
D=diag(diag(A)); %求A的对角阵
L=-tril(A,-1); %求A的下三角阵并取反
U=-triu(A,1); %求A的上三角阵并取反
B=D\(L+U);
f=D\b;
y=B*x0+f; %x0为迭代初值,长度等于未知数个数
n=1; %用来统计次数
while norm(y-x0)>=ep %2-范数与迭代精度比较
x0=y;
y=B*x0+f;
n=n+1;
end
这是Jacobi方法的函数文件代码,在求解时在程序中调用此函数文件即可得出结果。
fzero函数的调用格式如下
z=fzero(f,x0) , %f为待求根函数,x0为搜索起点,此函数只能给出离x0最近的根。
X=fsolve(f,x0,option)
option用于设置优化工具箱的优化参数
%用fsolve求解非线性方程组的解的函数文件
function F=myfun(X)
x=X(1);
y=X(2);
z=X(3);
F(1)=sin(x)+y+z^2*exp(x);
F(2)=x+y+z;
F(3)=x*y*z;
脚本文件如下
option=optimset('Display','off');
X=fsolve(@myfun,[1,1,1],option)