Re: [問題] 變數轉換 (2000P)已回收

看板MATLAB作者 (幻無影)時間15年前 (2010/06/23 22:17), 編輯推噓2(202)
留言4則, 2人參與, 最新討論串3/3 (看更多)
這裡用微分後型式比較簡單的 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
囧~~~ 我跑會出問題耶 rand"i" subs 也有問題=___=
06/24 15:37, 1F

06/25 01:28, , 2F
哦?你用的版本是?
06/25 01:28, 2F

06/25 02:09, , 3F
MATLAB7.1吧XDDDD
06/25 02:09, 3F

06/25 02:21, , 4F
呃... 是有點舊了無法測... 我試著改一下看看好了
06/25 02:21, 4F
※ 編輯: DigiPrince 來自: 140.113.94.230 (06/25 12:45)
文章代碼(AID): #1C8XTrKA (MATLAB)
文章代碼(AID): #1C8XTrKA (MATLAB)