Как использовать SymPy для решения сложного уравнения с приближенным решением - PullRequest
0 голосов
/ 30 августа 2018

Например,

>>> 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)
[]

Я знаю, что мы не можем получить очень точное решение, поэтому мой вопрос: как мы можем установить solve в SymPy, чтобы сделать это с некоторой допустимой точностью?

Функция sqrt(sin(u)*sin(u)+1) является лишь примером. Если возможно, это должна быть непредсказуемая функция пользовательского ввода.

1 Ответ

0 голосов
/ 30 августа 2018

Это не то, для чего предназначен SymPy. «Sym» в SymPy означает «символический», а не «числовой». Вы хотите числовые вычисления. Используйте 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

возвращает 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 затем используется, как указано выше.

...