Пользовательские произвольные имена констант для 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+)')

person Omegaman    schedule 15.04.2016    source источник
comment
Для этого я открыл проблему SymPy.   -  person asmeurer    schedule 18.04.2016


Ответы (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))
person Community    schedule 15.04.2016
comment
Спасибо. Есть ли способ сделать эту замену, не зная, сколько констант dsolve вставил? Я ищу общее решение отчасти потому, что C1 и C_1 отображаются одинаково в латексе, и не сразу очевидно, сколько констант dsolve вставлено. (Я немного обновил свой вопрос, чтобы уточнить, что я уже использую C_1 для других целей и хочу заменить C1 чем-то вроде k_1 - хотя я вижу, к чему вы идете.) - person Omegaman; 16.04.2016
comment
Я включил функцию, которая подменяется независимо от количества констант. - person ; 16.04.2016