利用matlab求解方程和方程組

卢宇博發表於2024-08-16

本章會介紹如何利用matlab的內建函式求解方程與方程組

目錄
  • 一、solve函式求解方程
    • 1.求解單變數方程
    • 2.求解週期函式的解
    • 3.求解多變數方程
    • 4.求解方程組
  • 二、vpasolve函式求解方程
    • 1.solve函式的缺點
    • 2.vpasolve函式的用法
      • (1)用vpasolve函式指定求範圍上的解
      • (2)用vpasolve函式給定搜尋的起始點
      • (3)用vpasolve函式進行隨機指定範圍進行搜尋解
  • 三、fsolve函式求解方程
    • 1.建立待求函式檔案
    • 2.fsolve函式用法

一、solve函式求解方程

1.求解單變數方程

solve(eqn, x)
對於單變數方程,在solve函式中的第一個引數需要輸入我們用符號變數定義的等式,第二個引數為需要求解的變數。因為即使是單變數方程,裡面的字元可能不止一個。

syms x
eqn = (sin(x) == 1);  % eqn = sin(x) == 1;  
answ = solve(eqn, x)

2.求解週期函式的解

因為三角函式是週期函式,如果要得到所有的解,則需要加上條件
返回的第二個引數是一個變數,而第三個引數則是這個變數需要滿足的條件,以這個三角函式為例,求出解後的末尾應該要加上2kΠ,我們來看一下結果

syms x
eqn = (sin(x) == 1);
[answ, params, condions] = solve(eqn, x, 'ReturnConditions', true)

下面的結果給出了params的符號為k,而conditions則是k所需要滿足的條件,為整數

answ = pi/2 + 2*pi*k
params = k 
condions = in(k, 'integer')

3.求解多變數方程

與單變數一樣,由於有多個符號,因此在第二個引數要設定好變數

syms a b c x
eqn = (a*x^2 + b*x + c == 0);
answ1 = solve(eqn, x)  % 將x視為未知數求解 
answ2 = solve(eqn, a) % 將a視為未知數求解

4.求解方程組

solve(eqn,[x1,x2])
求解方程組的形式與求解方程的寫法一樣,但是這裡的eqn為一個向量(行列均可),而第二個引數則是要指定好需要求解的變數

syms u v a
eqn=[2*u+v==a;u-v==1];
solve(eqn,[u,v])

最後返回的ans會是一個結構體,裡面儲存著u,v的符號解

當然,也可以用一個向量直接儲存符號解
[ansu,ansv]=solve(eqn,[u,v])

二、vpasolve函式求解方程

1.solve函式的缺點

solve函式進行求解複雜的函式時,可能會報錯,而且在方程存在多個解時,只能返回一個解而且會報錯,例如:

syms x
eqn = (sin(x) == x^2 - 1);
solve(eqn, x)

ans = -0.63673265080528201088799090383828
但其實我們畫圖可以看到,這個函式其實不止一個解(fplot函式可以繪製字元變數表示的影像)

fplot(sin(x), [-2 2])  
hold on
fplot(x^2 - 1, [-2 2]) 


因此,選擇用vpasolve函式更好地解決這個問題

2.vpasolve函式的用法

(1)用vpasolve函式指定求範圍上的解

syms x
eqn = sin(x) == x^2 - 1;
vpasolve(eqn, x, [0 2])

當變數有多個時,第三個引數應該輸入一個矩陣。如:vpasolve([eq1 eq2],[x y],[0 1; 1/2 2])

(2)用vpasolve函式給定搜尋的起始點

vpasolve([eq1,...,eqn],[x1,...,xm],X0)

(3)用vpasolve函式進行隨機指定範圍進行搜尋解

由於vpasolve函式一次只能返回一個解,但是方程並不總是有唯一解的,因此我們需要多次執行這個函式進行找解,然後用Uinique函式提取出所有的解,幸運的是,隨機尋找這個過程我們只需要呼叫函式的命令就行了。
random選項調節成true即可
vpasolve(eqn, x, 'random', true)

三、fsolve函式求解方程

fsolve是Matlab最佳化工具箱中的一個函式,可專門用來求解特別複雜的方程和方程組

1.建立待求函式檔案

fsolve是一個最佳化函式,可以解決複雜的方程問題,他所接受的函式不能僅僅是一個字元變數,需要重新創造函式檔案,而函式檔案的格式也有要求。
(1)當需要求解方程組時,我們的函式其實就是一個向量,不同方程組用F(i)來表示;同時,需要保證方程的右邊全為0,即把所有的數移到一邊
(2)當有多個自變數x時,使用向量的呼叫方法進行呼叫,例如x(1),x(2)

function F = my_fun(x)
    F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
    F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end

2.fsolve函式用法

fsolve(@fun,x0)
第一個引數是處在同一資料夾下自己建立的m檔案,第二個為初值

x0 = [0,0];  % 初始值
result_x = fsolve(@my_fun,x0)

相關文章