如何在SymPy中求解这个两个方程的系统?

如何在SymPy中求解这个两个方程的系统?

问题描述:

我具备的功能:如何在SymPy中求解这个两个方程的系统?

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

而且我想对于一个给定t来解决ab方程系统{f(0)=1 and f(1)=0}

对于t = 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)没有解决方案中发现的其它任意t:

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 

它是p可以从更有效的角度解决SymPy中的这个问题吗?

对于解决此问题很有用的Python包建议也非常受欢迎。

+0

你真的想要一个象征性的在你的情况如下,我会用它解?对于我来说,如果't'是一个整数,它就可以工作,尽管解决方案变得复杂得很快,因为它必须找到度't'多项式的根(也就是说,对于t> = 5,可能不会得到符号解决方案)。我不知道是否有关于理性“t”的闭式符号解决方案,但是如果它们可能至少是复杂的。 – asmeurer

你对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) 

你也可以绘制出结果,你比如从0.5到3改变t

>>> 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