Recall: Function handle and pseudo code
Recall: Solving linear system
fsolve
fsolve
是 matlab
最強大的工具之一 (另一個是反除 /
). 它可以解非線性方程. 也就是說, 若我們把要解的問題寫成以下形式:
那就能以 fsolve
來解.
其基本指令就是
X = fsolve(FUN,X0)
其中
ODEFUN
是個 function handle, 定義了要解的函數X0
是初始猜測X
則是算出來的解fsolve
是以迭代法來解, 所以需要一個初始猜測值, 然後找出一個解.
以下這例子想找
x = fsolve(@(x) sin(x), 2)
如果一開始想多猜幾個一起也是可以的, 比如說初始猜測值我們定 fsolve
就會將這五個初始值所收斂到的解算出來:
x = fsolve(@(x) sin(x), [0 2 4 6 8])
如果我們想知道 fsolve
解問題過程的一些細節也可以設定, 比如說我想知道迭代的情形, 可以要求顯示迭代過程:
x = fsolve(@(x) sin(x), [0 2 4 6 8], optimoptions('fsolve','Display','iter'))
假設我定一個函數, 有兩個 input,
% myfun.m
function y = myfun(x,c)
y = sin(c*x);
但是我想要解當
c = 2;
x0 = 1; % 初始猜測值
x = fsolve(@(x) myfun(x,c), x0)
當然, 有可能我就是想解雙變數函數, 也就是我要找
因為有兩個未知數, 不過只有一個方程式, 所以有無限多組解.
所以, 以下這樣的系統才有機會求根:
% myfun2.m
function F = myfun2(X)
% X: 2x1 vector
% F: 2x1 vector
F(1,1) = sin(X(1)+X(2));
F(2,1) = cos(X(1)-X(2));
那就直接解雙變數:
x0 = [2, 1]; % 初始猜測值
X = fsolve(@myfun2, x0)
Recall Assignment in Root finding,
Use fsolve
to solve that problem.
Recall Assignment in ODE solver
以 finite difference method 解以下的 two-point boundary value problem:
我們先將
這樣的話可以將
所以兩個邊界條件
接著, 將微分方程以有限差分法離散得到
所以我們希望求出 fsolve
將它解出來.