Примечание: я отредактировал ваше уравнение в соответствии с комментариями 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
решение должно быть положительным, проверьте свои числа и уравнения.