2015-10-14 3 views
3

У меня есть функция:Как решить эту систему двух уравнений в SymPy?

f(x) = 1/(x + a)^t + b 

И я хотел бы решить для данного t для a и b системы уравнений {f(0)=1 and f(1)=0}.

Для т = 1 решение успешно рассчитывается:

import sympy as sp 
a,b = sp.symbols("a b") 
res = sp.solve([1/(a+1)**1 +b, 1/a**1+b-1], [a,b]) 
res 
# [(-1/2 + sqrt(5)/2, -sqrt(5)/2 + 1/2), (-sqrt(5)/2 - 1/2, 1/2 + sqrt(5)/2)] 

Но для любого т, кроме 1 (и большую часть времени также 2) не найдено ни одно решение:

import sympy as sp 
a,b = sp.symbols("a b") 
res = sp.solve([1/(a+1)**1.5 +b, 1/a**1.5+b-1], [a,b]) 
res 

дает :

NotImplementedError: could not solve 
b*(-(1 + sqrt(3)*I)*(1/(b**2 - 2*b + 1))**(1/3)/2 + 1)**(3/2) + 1 

Является ли это р возможно ли подойти к этой проблеме в SymPy с более эффективного угла?

Предложения для пакетов Python, полезных для решения этой проблемы, также приветствуются.

+0

Вы действительно хотите символьной решение? Для меня это прекрасно работает, если 't' является целым числом, хотя решения усложняются быстро, потому что они должны найти корни полинома степени' t' (что также означает, что при t> = 5 вы не можете получить символическую решение вообще). Я не знаю, существуют ли символические решения замкнутой формы для рационального 't', но если они есть, вероятно, по крайней мере такие же сложные. – asmeurer

ответ

1

Какие предположения вы делаете о t? Вы можете, конечно, решить систему нелинейных уравнений численно с помощью, например, scipy.optimize.root.

Я написал экспериментальный пакет pyneqsys, чтобы помочь с этим, когда вы начинаете с символических выражений. В вашем случае я хотел бы использовать его следующим образом:

>>> import sympy as sp 
>>> from pyneqsys.symbolic import SymbolicSys 
>>> a, b, t = sp.symbols('a b t') 
>>> f = lambda x: 1/(x+a)**t + b 
>>> neqsys = SymbolicSys([a, b], [f(0) - 1, f(1) - 0], [t]) 
>>> ab, sol = neqsys.solve_scipy([0.5, -0.5], 1) 
>>> ab, sol.success 
(array([ 0.61803399, -0.61803399]), True) 

Вы также можете построить результат, как вы меняетесь t от скажем 0,5 до 3:

>>> def solve(tval, guess=(.5, -.5)): 
...  vals, sol = neqsys.solve_scipy(guess, tval) 
...  assert sol.success 
...  return vals 
... 
>>> import numpy as np 
>>> import matplotlib.pyplot as plt 
>>> trange = np.linspace(.5, 3) 
>>> plt.plot(trange, np.array([solve(t_) for t_ in trange])) 

matplotlib plot of solutions