如何使用 SymPy 求解具有近似解的复杂方程
How to use SymPy to solve a complex equation with an approximate solution
例如,
>>> integrate(sqrt(sin(u)*sin(u)+1), (u, 0, b)).subs(b, 0.22).evalf()
0.221745186045595
但是我想反过来知道哪个b
可以得到0.221745186045595。所以我写
>>> solve(integrate(sqrt(sin(u)*sin(u)+1), (u, 0, b)) - 0.221745186045595, b)
[]
我知道我们无法获得非常精确的解决方案,所以我的问题是:我们如何设置 SymPy 的 solve
以达到一定的精度?
函数sqrt(sin(u)*sin(u)+1)
只是一个例子。如果可能,它应该是一个不可预测的、用户输入的函数。
这不是 SymPy 的用途。 "Sym" 在 SymPy 中表示 Symbolic,而不是 Numeric。你想要数值计算。使用 SciPy quad
和一些寻根例程,如 root
或 fsolve
。例如:
import numpy as np
from scipy import integrate, optimize
target = 0.221745186045595
f = lambda u: np.sqrt(np.sin(u)**2 + 1)
x = optimize.root(lambda b: integrate.quad(f, 0, b)[0] - target, 0).x
returns x
为 array([0.22])
。
正在解析用户输入
要将用户输入转换为可调用函数,如上面的 f
,可以使用 SymPy 的 lambdify
。示例:
from sympy import sympify, lambdify
f_string = "sqrt(sin(u)**2+1)" # user input
f_expr = sympify(f_string)
sym = next(iter(f_expr.free_symbols))
f = lambdify(sym, f_expr, "numpy")
这里f_expr
是一个从字符串解析出来的SymPy表达式,sym
是SymPy符号(函数的参数),f
是一个Python lambdify
创建的函数。这个 f
然后像上面那样使用。
例如,
>>> integrate(sqrt(sin(u)*sin(u)+1), (u, 0, b)).subs(b, 0.22).evalf()
0.221745186045595
但是我想反过来知道哪个b
可以得到0.221745186045595。所以我写
>>> solve(integrate(sqrt(sin(u)*sin(u)+1), (u, 0, b)) - 0.221745186045595, b)
[]
我知道我们无法获得非常精确的解决方案,所以我的问题是:我们如何设置 SymPy 的 solve
以达到一定的精度?
函数sqrt(sin(u)*sin(u)+1)
只是一个例子。如果可能,它应该是一个不可预测的、用户输入的函数。
这不是 SymPy 的用途。 "Sym" 在 SymPy 中表示 Symbolic,而不是 Numeric。你想要数值计算。使用 SciPy quad
和一些寻根例程,如 root
或 fsolve
。例如:
import numpy as np
from scipy import integrate, optimize
target = 0.221745186045595
f = lambda u: np.sqrt(np.sin(u)**2 + 1)
x = optimize.root(lambda b: integrate.quad(f, 0, b)[0] - target, 0).x
returns x
为 array([0.22])
。
正在解析用户输入
要将用户输入转换为可调用函数,如上面的 f
,可以使用 SymPy 的 lambdify
。示例:
from sympy import sympify, lambdify
f_string = "sqrt(sin(u)**2+1)" # user input
f_expr = sympify(f_string)
sym = next(iter(f_expr.free_symbols))
f = lambdify(sym, f_expr, "numpy")
这里f_expr
是一个从字符串解析出来的SymPy表达式,sym
是SymPy符号(函数的参数),f
是一个Python lambdify
创建的函数。这个 f
然后像上面那样使用。