SymPy中自定义函数复合问题:laplace与symmetric结果不符
解决差分算子复合与预期结果不一致的问题
问题原因
你当前的compose函数实现的是普通函数复合(将forward(x)的结果作为backward的输入参数),但这里需要的是差分算子复合——即先对函数u应用forward算子得到新函数,再对这个新函数应用backward算子。普通函数复合会把forward(x)的表达式直接塞进u的参数中,导致结果偏离预期。
修正方案
方案1:直接实现算子复合逻辑
不需要通用compose函数,直接按照差分算子复合的定义计算拉普拉斯算子:
from sympy import Function, Symbol, simplify from sympy.printing import pprint x = Symbol(name="x", real=True) h = Symbol(name="h", positive=True) u = Function("u") def forward(x): return (u(x + h) - u(x)) / h def backward(x): return (u(x) - u(x - h)) / h def symmetric(x): return (u(x - h) - 2 * u(x) + u(x + h)) / h**2 # 正确的算子复合:backward作用在forward的结果上,即计算(forward(x) - forward(x-h))/h laplace = lambda x: (forward(x) - forward(x - h)) / h pprint(symmetric(x)) pprint(simplify(laplace(x))) assert symmetric(x).equals(simplify(laplace(x))) print("验证通过:laplace与symmetric结果一致")
方案2:定义通用的算子复合函数
如果需要复用复合逻辑,可以将forward和backward改造成接收函数的算子,再实现算子复合:
from sympy import Function, Symbol, simplify from sympy.printing import pprint x = Symbol(name="x", real=True) h = Symbol(name="h", positive=True) u = Function("u") # 定义为算子:接收函数v,返回新函数 def forward_op(v): return lambda t: (v(t + h) - v(t)) / h def backward_op(v): return lambda t: (v(t) - v(t - h)) / h def symmetric(x): return (u(x - h) - 2 * u(x) + u(x + h)) / h**2 # 算子复合:f∘g 表示先应用g,再应用f def compose_ops(f, g): return lambda v: f(g(v)) laplace_op = compose_ops(backward_op, forward_op) laplace = laplace_op(u) pprint(symmetric(x)) pprint(simplify(laplace(x))) assert symmetric(x).equals(simplify(laplace(x))) print("验证通过:laplace与symmetric结果一致")
结果说明
两种方案运行后,laplace(x)化简后都会和symmetric(x)完全一致,满足差分算子复合的需求。
内容的提问来源于stack exchange,提问作者Oromion
相关产品推荐
相关产品推荐

