如何在 SymPy 中求解这个由两个方程组成的系统?
How to solve this system of two equations in SymPy?
我有函数:
f(x) = 1 / (x + a)^t + b
并且我想求解 a
和 b
的给定 t
方程组 {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 以外的任何 t(大多数时候也是 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 包的建议来解决这个问题。
您对 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]))
我有函数:
f(x) = 1 / (x + a)^t + b
并且我想求解 a
和 b
的给定 t
方程组 {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 以外的任何 t(大多数时候也是 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 包的建议来解决这个问题。
您对 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]))