2

dsolve()C1、C2などとは異なるシーケンスで名前が付けられた任意の定数を使用できるようにする方法はありますか?

cse()名前の無限のジェネレーターを受け入れるパラメーターを許可しsymbolsますが、同様のパラメーターは見当たりませんdsolve()

記号容量でいっぱいの回路方程式を解いていますが、dsolve定数がわかりにくくなっています。

それに失敗した場合、任意の定数を k_1、k_2 などの他の定数に置き換える簡単な方法はありますか? dsolve()私のコードは静電容量にC_1、C_2などを使用しているのに対し、その定数にはC1、C2などを使用しているようです。非標準の静電容量記号を使用するようにどこでも名前を変更できますが、そうしないことをお勧めします。


@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+)')
4

1 に答える 1

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))
于 2016-04-15T23:23:32.210 に答える