как использовать SymPy или другую библиотеку, чтобы получить численное решение - PullRequest
0 голосов
/ 17 февраля 2020

Я пытался решить два уравнения для двух неизвестных символов «Дифф» и «ОН». уравнения приведены ниже

x = (8.67839580228369e-26*Diff + 7.245e-10*OHs**3 + 
1.24402291559836e-10*OHs**2 + OHs*(-2.38073807380738e-19*Diff - 
2.8607855978291e-18) - 1.01141409254177e-29)

J= (-0.00435840284294195*Diff**0.666666666666667*(1 + 
3.64525434266056e-7/OHs) - 1)

solution = sym.nsolve ((x, J), (OHs, Diff), (0.000001, 0.000001))
print (solution)

это правильный путь для решения двух неизвестных?

Спасибо за помощь:)

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Примечание: я отредактировал ваше уравнение в соответствии с комментариями Vialfont.

Я бы сказал, что это возможный способ, но вы могли бы добиться большего, заметив, что уравнение J можно легко решить для OHs, и подставить в уравнение x. В таком случае nsolve будет гораздо легче решить:

>>> osol = solve(J, OHs)[0]  # there is only one solution
>>> eq = x.subs(OHs,osol)
>>> dsol = nsolve(eq, 1e-5)
>>> eq.subs(Diff,dsol) # verify
4.20389539297445e-45
>>> osol.subs(Diff,dsol), dsol
(-2.08893263437131e-12, 4.76768525775849e-5)

Но это все еще довольно плохо с точки зрения масштабирования ... действуйте с осторожностью. И я бы предложил написать Diff**Rational(2,3) вместо Diff**0.666666666666667. Или лучше, тогда пусть Diff будет y**3, так что вы работаете с полиномом в y.

>>> y = var('y', postive=True)
>>> yx=x.subs(Diff,y**3)
>>> yJ=J.subs(Diff,y**3)
>>> yosol=solve(yJ,OHs)[0]
>>> yeq = yx.subs(OHs, yosol)

Теперь решения eq будут там, где его числитель равен нулю, поэтому найдите вещественное корни этого:

>>> ysol = real_roots(yeq.as_numer_denom()[0])
>>> len(ysol)
1
>>> ysol[0].n()
0.0362606728976173
>>> yosol.subs(y,_)
-2.08893263437131e-12

Это согласуется с нашим предыдущим решением, и на этот раз решения в ysol были точными (с учетом ограничений коэффициентов). Поэтому, если ваше OHs решение должно быть положительным, проверьте свои числа и уравнения.

1 голос
/ 17 февраля 2020

Ваши выражения не соответствуют требованиям Sympy, включая экспоненциальные выражения. Может быть, проще начать с более простой системы, чтобы решить с двумя неизвестными, и только квадрат, такой как:

from sympy.abc import a,b,x, y 
from sympy import solve,exp
eq1= a*x**2 + b*y+ exp(0)
eq2= x + y + 2
sol=solve((eq1, eq2),(x,y),dict=True)

sol включает ваши ответы, и у вас есть доступ к решениям с sol[0][x] и sol[0][y]. Задание значений для параметров выполняется методом .sub():

sol[0][x].subs({a:1, b:2}) #gives -1
sol[0][y].subs({a:1, b:2}) #gives -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...