Re: [問題] 自定義函數偏微分後再定義函數失效

作者: LPH66 (-6.2598534e+18f)   2021-03-15 19:31:06
※ 引述《pig030 (FEBUR.PHEIX)》之銘言:
: 各位大大好,小弟經常要手動寫一些偏微分方程線性化的問題。
: 以下是小弟的一個簡單的範例:
: TC[q_, K_] := (1/3) q^3 - 4 q^2 + (28 - 2 K) q + 0.5 K^2
: 自定義一個TC的函數,引入變數為q及K
: AC[q_,K_]:= D[TC[q, K], q]
: 自定義上面的函數,對q作偏微分後,形成一個新的自定義函數
: 結果小弟執行 AC[2,2] 時卻失敗了。無法執行出結果,錯誤訊息如下:
: SetDelayed::write: Tag Plus in (28-2 K-8 q+q^2)[q_,K_] is Protected.
: 不好意思,因為這問題卡了小弟很多年,小弟學這軟体是土法練鋼,完全自學
: 所以並不清楚真正的原因。拜請大大告訴小弟。
從你的錯誤訊息看起來
你應該在輸入這個 AC 定義之前有先做過
AC = D[TC[q, K], q]
這一行 (不是你要的) 指令, 所以 AC 的值被指定成了一個運算式
因此你後續在設定函數時就會失敗
這問題只要先行先把 AC 內容清掉即可, 指令是 Clear[AC]
====
如果不確定一個變數的定義內容的話
可以用 ? 指令叫出目前它的定義
也就是例如你如果先輸入 ? AC 的話就會看到它不是定義成函數了
====
不過如果照你上面這樣定義的話會有另一個問題
:= 右邊的式子會保留輸入時的原狀, 然後等變數代進去之後才會算值
所以如果真的寫成
AC[q_, K_] := D[TC[q, K], q]
這樣的話, 右邊的 D 不會先求完才變成函數定義, 而是保留原樣
所以當代值進去時, 參數會代進 D 的式子裡的所有變數
例如 AC[2, 2] 就會變成 D[TC[2, 2], 2] 然後就噴錯誤說 2 不是變數了
那原因既然是式子沒有先算, 那我們只要強制它算就好
方法就是在右邊包上 Evaluate[]
也就是寫成 AC[q_, K_] := Evaluate[D[TC[q, K], q]]
這樣右邊的 D 就會先算出來才會設定成函數給你求值
(同樣這可以用 ? AC 驗證, 可以看到這時的定義就是 D 已經算完的結果了)
https://i.imgur.com/Ffe4k3J.png
作者: pig030 (FEBUR.PHEIX)   2021-03-15 21:59:00
感謝LPH66大大,真是精采的解說。我也查了外國的說明那些外國人都沒有你說的清楚,一針見血。

Links booklink

Contact Us: admin [ a t ] ucptt.com