MATLAB學習筆記(七)——MATLAB解方程與函數極值


(一)線性方程組求解

包含n個未知數,由n個方程構成的線性方程組為:

image

其矩陣表示形式為:image

其中

image

一、直接求解法

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。則

image

    然后得到迭代公式為

image

    如果收斂的話,就可得到方程的解。

(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

image

x =

    0.9958
    0.9579
    0.7916


n =

    11

2、Gauss-Serdel迭代法

(1)原理說明

        由於每一次的x都已經算出來了,就沒比較再從頭算一次了。就是省略了無效的迭代次數,然后我們就得到一個新的迭代公式。

     image

(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、由中值定理可得:

image

     所以,根據上述遞推式之后能夠計算未知函數y在點image,i=0,1,……,n的一列的數值解。

     當然,使用的遞推公式都會有一個誤差累計的問題,所以我們使用龍格——庫塔公式:

image

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

image

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');

紅色是精確解,藍色是離散解,可以得到差距不大。

image

4、demo2

image

     對於高階的常微分方程。首先要轉換為一階常微分方程組。即狀態方程(上面有兩點表示二次導數= =)

令:image,則原式化為

image

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));
image

(四)函數極值

1、MATLAB求解方法

x=fmin('fname',x1,x2);       %求單變量函數的最小值
x=fmins('fname',x0);         %求多變量函數的最小值
image

2、沒有求最大值的方法,但是我們可以通過求-fmin(-f(x))的方法求最大值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM