2016-04-15 4 views
2

Есть ли способ обеспечить получение dsolve() для использования произвольных констант, названных другой последовательностью, чем C1, C2 и т. Д.?Пользовательские произвольные постоянные имена для sympy dsolve?

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

Я открыл [SymPy выпуск] (https://github.com/sympy/sympy/issues/11024) для этого. – asmeurer

ответ

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)) 
+0

Спасибо. Есть ли способ сделать эту замену, не зная, сколько констант 'dsolve' вставил? Я ищу общее решение отчасти потому, что C1 и C_1 оба проявляют то же самое в латексе, и не сразу видно, сколько вставленных констант dsolve. (Я немного уточнил свой вопрос, чтобы уточнить, что я уже использую C_1 для других целей и хочу заменить C1 чем-то вроде k_1-- Я вижу, куда вы идете.) – Omegaman

+0

Я включил функцию, которая поддерживает независимо от число констант. –