sympy dsolve 的自定义任意常量名称?

Custom arbitrary constant names for sympy dsolve?

有没有办法提供 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+)')

我在 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))