本章會介紹如何利用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)