(一)線性方程組求解
包含n個未知數,由n個方程構成的線性方程組為:
其中
一、直接求解法
1、左除法
x=A\b;
如果A是奇異的,或者接近奇異的。MATLAB會發出警告信息的。
2、利用矩陣的分解來求解線性方程組(比單單進行左除速度快)
(1)LU分解(只有方陣可以使用)
LU分解就是分解成一個交換下三角矩陣(也就是說進行一定的操作后才是下三角矩陣)和一個上三角矩陣(不需要變換)的乘積形式。只要A是非奇異的,就可以進行LU分解。
MATLAB提供的LU分解函數對於矩陣進行LU分解:
[L,U]=lu(X); %X必須是方陣
[L,U,P]=lu(X); %PX=LU。X必須是方陣
實現LU分解之后,線性方程組Ax=b的解就為x=U\(L\b)或x=U\(L\Pb)、
(2)QR分解(A是非奇異的)
QR分解就是分解成一個正交矩陣Q和一個上三角矩陣R的乘積形式。只要A是非奇異的,就可以進行QR分解。QR只能對方陣進行分解。
[Q,R]=qr(X); %X=QR
[Q,R,E]=qr(X); %XE=QR
實現QR分解之后,解為x=R\(Q\b)或x=E(R\(Q\b))。
(3)Cholesky分解(X是正定的)
如果X是正定的。則將矩陣分解成一個下三角矩陣和上三角矩陣的乘積。上三角矩陣為R,下三角矩陣為其轉置,X=R’R.
MATLAB進行CHolesky分解方法:
R=chol(X); [R,p]=chol(X); %p=0則為正定矩陣,返回一個R,或者p為一個正整數q=p-1,滿足R'R=X(1:q,1:q)
則線性方程組的解為x=R\(R’\b)
二、迭代法求解(求解大型系數矩陣的方程組)
1、Jacobi迭代法
(1)原理解釋
對於Ax=b,如果A為非奇異,那么A就可以分解成一個對角陣D,一個下三角陣L和一個上三角陣U,使得A=D-L-U。則
然后得到迭代公式為
如果收斂的話,就可得到方程的解。
(2)MATLAB編程求解(= =,很簡單的迭代。但是如果沒有解的話,會得到NAN= = )
function [y,n]=jacobi(A,b,x0,eps) %A為系數矩陣,b為向量,x0為初值。 if nargin==3 %輸入參數至少為3個 eps=1.0e-6; elseif nargin<3 error return end D=diag(diag(A)); %求A得對角矩陣 L=-tril(A,-1); %求A的下三角陣(沒有對主對角線),由於是拆成A=D-L-U,所以前面加了“-”號,下同 U=-triu(A,1); %求A的上三角陣(沒有對主對角線)。 B=D\(L+U); f=D\b; y=B*x0+f; n=1; %迭代次數 while norm(y-x0)>=eps x0=y; y=B*x0+f; n=n+1; end
(3)一個demo
x = 0.9958 0.9579 0.7916 n = 11
2、Gauss-Serdel迭代法
(1)原理說明
由於每一次的x都已經算出來了,就沒比較再從頭算一次了。就是省略了無效的迭代次數,然后我們就得到一個新的迭代公式。
(2)MATLAB編程求解
function [y,n]=gauseidel(A,b,x0,eps) %A為系數矩陣,b為列向量,x0為初值。 if nargin==3 eps=1.0e-6; elseif nargin<3 error return end D=diag(diag(A)); %求A的對角矩陣 L=-tril(A,-1); %求A的下三角陣 U=-triu(A,1); %求A的上三角陣 G=(D-L)\U; f=(D-L)\b; y=G*x0+f; n=1; while norm(y-x0)>=eps x0=y; y=G*x0+f; n=n+1; end
PS:
使用迭代法,一般只能找到一組解(離初值最近的解)。然后使用迭代法,一定要能收斂才能夠使用。
(三)——常微分方程初值問題的數值解法
一般是比較難解出來解析解,所以一般求得離散解就很不錯了。
一、龍格——庫塔法簡介
1、由中值定理可得:
所以,根據上述遞推式之后能夠計算未知函數y在點,i=0,1,……,n的一列的數值解。
當然,使用的遞推公式都會有一個誤差累計的問題,所以我們使用龍格——庫塔公式:
2、MATLAB封裝的龍格——庫塔法實現
[t,y]=ode23('fname',tspan,y0); [t,y]=ode45('fname',tspan,y0);
其中,fname是定義f(t,y)的函數文件名,該函數文件必須返回一個列向量。
tspan形式為[t0,tf],表示求解區間。
y0是初始狀態列向量。
t,y分別給出求解的相應向量。
然后自己會自動采用步長大小,所以效率還是不錯的。
3、demo1
MATLAB編程求解
t0=0;tf=10; y0=2; [t,y]=ode23('funt',[t0,tf],y0); %龍格——庫塔法的離散解 y1=sqrt(t+1)+1; %精確解 plot(t,y,'-b*'); hold on; plot(t,y1,':ro');
紅色是精確解,藍色是離散解,可以得到差距不大。
4、demo2
對於高階的常微分方程。首先要轉換為一階常微分方程組。即狀態方程(上面有兩點表示二次導數= =)
MATLAB求解
t0=0;tf=20; x0=[0;0.25]; [t,x]=ode23('funt',[t0,tf],x0) subplot(1,2,1);plot(t,x); subplot(1,2,2);plot(x(:,1),x(:,2));

(四)函數極值
1、MATLAB求解方法
x=fmin('fname',x1,x2); %求單變量函數的最小值 x=fmins('fname',x0); %求多變量函數的最小值
