如何使用SymPy解决具有近似解的复杂方程

问题描述 投票:0回答:1

例如,

>>> 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)只是一个例子。如果可能,它应该是一个不可预测的用户输入功能。

python sympy solver
1个回答
1
投票

这不是SymPy的用途。 SymPy中的“Sym”表示符号,而不是数字。你想要数值计算。使用SciPy quad和一些寻根程序,如rootfsolve。例如:

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

x作为array([0.22])返回。

Parsing user input

为了将用户输入转换为像上面的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是由lambdify创建的Python函数。然后如上使用该f

© www.soinside.com 2019 - 2024. All rights reserved.