Re: [問題] 變數轉換 (2000P)已回收
這裡用微分後型式比較簡單的 f(x)*g(x) 當作例子:
% generate test data for substitution
T = sym(rand([50, 6]));
% differentiate
d = diff(sym('f(x)*g(x)'), sym('x'), 2);
% substitute
s = subs(d, ...
{sym('diff(f(x), x$2)'), ...
sym('diff(g(x), x$2)'), ...
sym('diff(f(x), x$1)'), ...
sym('diff(g(x), x$1)'), ...
sym('diff(f(x), x$0)'), ...
sym('diff(g(x), x$0)')}, ...
{T(:, 1), ...
T(:, 2), ...
T(:, 3), ...
T(:, 4), ...
T(:, 5), ...
T(:, 6)});
% convert symbolic to numeric
r = double(s);
除了一開始生成測試資料之外,程式主要有三步。
第一步是生成微分後的式子,也就是程式中的 d。
(diff 的最後一個參數 2 是針對變數微分兩次的意思。)
第二步就是代換,這部份的重點有幾個:
1. diff(f(x), x$n) 代表的意思是對 x 微分 n 次。
2. 如果要代換成向量,所有的代換必須一次完成。
以上面舉的例子來說,丟進去代換的向量長度都是 50,
要是分開成六個 subs 分次代換不同項的話,
結果的長度不會是 50 而是 50^6。
3. 微分的高次項必須放在前面,因為高次項是低次的微分,
假如低次項先被數值代換掉了,高次全都會直接變 0。
做完代換之後,出來的 s 雖然是數字了,但骨子裡還是
sym 物件,所以第三步所做的事情就是把結果轉換成 MATLAB
裡常用的 double,以利後續處理。這步其實可有可無,
做不做端看你之後是要拿結果做什麼而定。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
推
06/24 15:37, , 1F
06/24 15:37, 1F
→
06/25 01:28, , 2F
06/25 01:28, 2F
推
06/25 02:09, , 3F
06/25 02:09, 3F
→
06/25 02:21, , 4F
06/25 02:21, 4F
※ 編輯: DigiPrince 來自: 140.113.94.230 (06/25 12:45)
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):