(A-x-y)(B-x-β) = K1(x-α)
(A-x-y)(C-y-α) = K2(y-β)
(x-α) (C-y-α) = K3(α+β)
(y-β)(B-x-β) = K4(α+β)
Constant: K1.K2.K3.K4
input : A.B.C
output: α.β.x.y
===================================================
根據題目 K1~K4常數,
作者假設 K1=2;K2=5.71;K3=3;K4=1.0;
而A, B, C為輸入參數, 在此A=30;B=20;C=60;
x, y, α,β為未知數,
可以假設為 Z = [x, y, α,β];
猜初始解 Z0 = [ 0 0 0 0];
新增script file命名 func.m 內容如下
其中F為四個恆等式全部移到等號左邊, 希望F≃[ 0 0 0 0]T
1: function F = func(Z, A, B, C, K)
2: % input parameters : A, B, C
3: % constant K = [K1, K2, K3, K4]
4:
5: F = [ (A-Z(1)-Z(2))*(B-Z(1)-Z(4))-K(1)*(Z(1)-Z(3));
6: (A-Z(1)-Z(2))*(C-Z(2)-Z(3))-K(2)*(Z(2)-Z(4));
7: (Z(1)-Z(3))*(C-Z(2)-Z(3))-K(3)*(Z(3)+Z(4));
8: (Z(2)-Z(3))*(B-Z(1)-Z(4))-K(4)*(Z(3)+Z(4));];
9: end
此外, 撰寫主程式 go.m
1: A=30;B=20;C=60; % input parameter
2: K1=2;K2=5.71;K3=3;K4=1.0; % constant
3: Z0 = [0 0 0 0]; % initial guess
4: K = [K1 K2 K3 K4];
5: [Z,FVAL,EXITFLAG] = fsolve(@(Z) func(Z,A,B,C,K), Z0)
其中@( Z ) func(Z, A, B, C, K) 為anonymous function表示Z為未知數, 用( )表示, 如果未知數一個以上就, 區隔
執行結果:
Z=[10.1211 18.1556 8.6104 8.1256]
FVAL為將Z帶入F結果, 或是
>> func(Z, A, B, C, K)
ans =
1.0e-11 *
0.0477
-0.1599
0.0114
0.0163
EXITFLAG= 1 fsolve converged to a root.
1: Z =
2:
3: 10.1211 18.1556 8.6104 8.1256
4:
5:
6: FVAL =
7:
8: 1.0e-11 *
9:
10: 0.0477
11: -0.1599
12: 0.0114
13: 0.0163
14:
15:
16: EXITFLAG =
17:
18: 1
留言列表