【问题标题】:Custom arbitrary constant names for sympy dsolve?sympy dsolve的自定义任意常量名称?
【发布时间】:2016-04-15 22:57:01
【问题描述】:

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

【问题讨论】:

标签: sympy dsolve


【解决方案1】:

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

【讨论】:

  • 谢谢。有没有办法在不知道dsolve 插入了多少常量的情况下进行替换?我正在寻找一个通用的解决方案,部分原因是 C1 和 C_1 在乳胶中都显示相同,并且插入了多少常量 dsolve 并不是很明显。 (我稍微更新了我的问题,以澄清我已经将 C_1 用于其他目的,并希望将 C1 替换为 k_1 之类的东西——不过我知道你要去哪里了。)
  • 我包含了一个函数,无论常量的数量是多少。
猜你喜欢
  • 2019-07-21
  • 2012-03-18
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多