有没有办法让get dsolve()
使用由C1,C2等不同序列命名的任意常量?
cse()
允许symbols
参数接受无限的名称生成器,但我没有看到与dsolve()
类似的参数。
我正在解决充满符号电容的电路方程,并且dsolve
常数变得混乱。
如果失败了,是否有一种快速方法可以将其他常量替换为k_1,k_2等其他常量?看起来dsolve()
正在使用C1,C2等等,而我的代码使用C_1,C_2等来获取电容。我可以在任何地方更改我的命名以使用非标准电容符号,但我不愿意。
感谢@Marshmallow,我已经开始使用这个包装dsolve的例程让我在事后改变符号。仍然存在碰撞的风险,但现在已经足够好了:
def newdsolve(eq,*args,**kwds):
ss=kwds.get('symbols')
sln=dsolve(eq,*args,**kwds)
psyms=((newdsolve.csre.match(n.name),n) for n in eqVc.free_symbols)
if ss and isinstance(ss,str):
subsdict=dict([(n[1],'k_'+n[0].group(1)) for n in psyms if n[0]])
elif ss:
subsdict=dict([(n[1],next(ss)) for n in psyms if n[0]])
else: subsdict={}
return sln.subs(subsdict)
newdsolve.csre=re.compile(r'C(\d+)')
答案 0 :(得分:2)
我在dsolve
中也没有看到这样的选项,但您可以使用subs
将符号C1,C2替换为您自己的符号。函数sub_const
将其替换为例如k_1,k_2等,直到表达式停止变化。可以用另一个字符代替k:它是一个参数。
from sympy import *
def sub_const(expr, char):
i = 1
while True:
old = symbols('C{}'.format(i))
new = symbols(char + '_{}'.format(i))
new_expr = expr.subs(old, new)
if new_expr == expr:
return expr
expr = new_expr
i += 1
x, f = symbols('x, f')
print(sub_const(dsolve(Derivative(f(x), x, x) + 9*f(x), f(x)), 'k'))
输出:
Eq(f(x), k_1*sin(3*x) + k_2*cos(3*x))