如何能让upvalue计算优先于downvalue
mathematica吧
全部回复
仅看楼主
level 3
骆易 楼主
主要目的是更优雅的定义奇异函数的Macaulay括号积分法则。
如果要计算奇异函数,如下定义。Macaulay的下值。
Macaulay[x_, a_, n_Integer?NonNegative] := (x - a)^n*UnitStep[x - a]
Macaulay[x_, a_, n_Integer?Negative] :=
Derivative[-n - 1][DiracDelta][x - a]
对积分法则,定义 Macaulay的上值
Macaulay /: Integrate[Macaulay[x_, a_, n_Integer?Negative], x_] :=
Macaulay[x, a, n + 1]
Macaulay /: Integrate[ Macaulay[x_, a_, n_Integer?NonNegative], x_] :=
1/(n + 1) Macaulay[x, a, n + 1]
现在的问题是,因为Macaula已经有了下值定义,在积分时,下值会优先上值被计算
(* in *)
Integrate[Macaulay[x, a, -2], x]
(* out *)
DiracDelta[-a + x]
如果清除Macaula的下值,会得到我想要的结果。
(* in *)
DownValues[Macaulay] =.
Integrate[Macaulay[x, a, -2], x]
(* out *)
Macaulay[x, a, -1]
-------------------------------------------------------
我参考了stackexchange上的帖子,可以改变求值顺序。
https://mathematica.stackexchange.com/questions/95087/is-it-possible-to-change-the-order-that-symbol-definitions-are-checked-downval
(* in *)
Hold[Integrate[Macaulay[x, a, -3], x]] /. UpValues[Macaulay]
(* out *)
Hold[Macaulay[x, a, -3 + 1]]
但这不是我想要的。一旦去除Hold,Macaulay[x, a, -3 + 1] 又会自动计算其下值。
如何能既保留Macaulay的下值定义,又阻止计算直接返回Macaulay[x, a, -3 + 1]形式呢?
2025年02月27日 07点02分 1
level 3
骆易 楼主
目前只想到定义两个不同的符号,分别用于积分和实际计算值。
2025年02月27日 12点02分 2
level 4
Hold[Integrate[Macaulay[x, a, -3], x]] /. UpValues[Macaulay] // ReleaseHold
output:
Derivative[1][DiracDelta][-a + x]
2025年02月27日 15点02分 3
……LZ已经说了这不是他想要的,请仔细阅读帖子。
2025年03月01日 01点03分
吧务
level 15
我觉得你2楼的办法已经挺好了。可行的方法还有一些,但是实质上都差不多,比如,用Inactive,同时自定义一个积分:
int[Inactive[Macaulay][x_, a_, n_], x_] :=
Inactive[Macaulay][x, a, n + 1]
int[Inactive[Macaulay][x, a, -3], x]
又比如说,在Macaulay的自变量上做点手脚:
Clear[Macaulay]
Macaulay[x_, a : Except[_HoldForm],
n_Integer?NonNegative] := (x - a)^n*UnitStep[x - a]
Macaulay[x_, a : Except[_HoldForm], n_Integer?Negative] :=
Derivative[-n - 1][DiracDelta][x - a]
Macaulay /:
Integrate[Macaulay[x_, a_HoldForm, n_Integer?Negative], x_] :=
Macaulay[x, a, n + 1]
Macaulay /:
Integrate[Macaulay[x_, a_HoldForm, n_Integer?NonNegative], x_] :=
1/(n + 1) Macaulay[x, a, n + 1]
Integrate[Macaulay[x, HoldForm@a, -3], x]
(* Macaulay[x, HoldForm[a], -2] *)
2025年03月01日 02点03分 4
1