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

看板Mathematica作者 ( )時間3年前 (2021/03/15 19:31), 編輯推噓1(101)
留言2則, 1人參與, 3年前最新討論串2/2 (看更多)
※ 引述《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
-- 'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.0.237 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Mathematica/M.1615807868.A.610.html

03/15 21:59, 3年前 , 1F
感謝LPH66大大,真是精采的解說。我也查了外國的說明
03/15 21:59, 1F

03/15 22:00, 3年前 , 2F
那些外國人都沒有你說的清楚,一針見血。
03/15 22:00, 2F
文章代碼(AID): #1WJqLyOG (Mathematica)
文章代碼(AID): #1WJqLyOG (Mathematica)