python相减函数subs,自定义sympy中函数子类的subs()功能
我認為你需要改變一下你的方式。在
正在創建Var函數。
您確實希望示例中的Var是一個Function類。sympy是圍繞函數是類而設計的,并使用eval()類方法來計算它們。重寫Function子類的__call__似乎非常不標準,而且我還沒有看到任何使用這個的sympy內置函數,所以我認為這不是正確的方法。一種方法是創建一個工廠函數來為您創建類:def Variation(path_, st_, en_, v_):
class Variation(Function):
nargs = 2
path = path_
st = st_
en = en_
ends = [st, en]
v = v_
@classmethod
def eval(cls, tt, ss):
if tt in cls.ends:
return cls.path(tt)
if ss == 0:
return cls.path(tt)
return cls.v(tt, ss)
return Variation
Var = Variation(c, a, b, Function(r'\vartheta'))我已經用一個實際的函數替換了您的'name'變量,這似乎更合理。在
現在,您可以使用標準標志創建變體并阻止立即求值(如果需要):
^{pr2}$
您也可以通過展平Var函數并將sten和{}參數直接傳遞到eval()中,這將刪除工廠函數的額外層:class Variation(Function):
@classmethod
def eval(cls, path, st, en, v, tt, ss):
if tt in [st, en]:
return path(tt)
elif ss == 0:
return path(tt)
else:
return v(tt, ss)
Variation(c, a, b, Function(r'\vartheta'), a, t)
>>> Variation(c, a, b, \vartheta, a, t)
請注意,由于您可以重寫.eval(),因此您可以對其進行修改,使其不會自動簡化(如果需要),并且只返回一個cls的新實例:class Variation(Function):
no_eval = True
@classmethod
def eval(cls, tt, ss):
if cls.no_eval:
return cls(tt, ss, evaluate=False)
# etc.
自定義.subs()
默認情況下,無論何時執行subs(),sympy也將執行eval()(按照the ^{} docs)。因此,默認情況下,當您使用一個特殊值執行.subs()時,.eval()將被調用,函數將被簡化。在
但是,如果需要,現在可以重寫._eval_subs()并執行自己的操作:class Variation(Function):
...
def _eval_subs(self, old, new):
# return self to do no substitutions at all
return self
# return None to continue normally by next calling _subs on the arguments to this Function
# return some other Expression to return that instead.
請注意,._eval_subs()返回的任何內容隨后也將被.eval()編輯。如果您想繞過這個問題,可以按照上面的說明覆蓋.eval()。在
所以我認為這回答了關于如何修改.subs()行為的問題。。。在
我不太明白你想要什么:is there a good guide to construct arbitrary mathematical functions on python?
我認為sympy相當不錯,它的代碼庫中有許多合理的文檔和許多內置的示例,這些都很容易被剽竊。無論如何,請求向導是在stackoverflow上off-topic (see point 4);-)。在
總結
以上是生活随笔為你收集整理的python相减函数subs,自定义sympy中函数子类的subs()功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易到用车最艰难时刻,未来赌什么?
- 下一篇: 易到实际控制人温晓东成老赖:与贾跃亭曾是