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