我从未使用过python,但Mathematica无法处理我想要解决的等式。我试图解决以下等式的变量“a”,其中s,c,mu和delta t是已知参数。
我尝试在Mathematica中做NSolve,Solve等,但是它运行了一个小时没有运气。由于我不熟悉Python,有没有办法用Python来解决这个等式?
答案 0 :(得分:3)
你不会找到这些方程的解析解,因为它们是超越的,在三角函数的内部和外部都包含a
。
我认为您使用数值解决方案时遇到的麻烦是a
的可接受值范围受arcsin
的约束。由于arcsin
仅针对-1和1之间的参数定义(假设您希望a
为实数),因此alpha
和beta
的公式需要a > s/2
}和a > (s-c)/2
。
在Python中,您可以使用f(a) = 0
函数找到第三个等式的零(使用brentq
形式重写):
import numpy as np
from scipy.optimize import brentq
s = 10014.6
c = 6339.06
mu = 398600.0
dt = 780.0
def f(a):
alpha = 2*np.arcsin(np.sqrt(s/(2*a)))
beta = 2*np.arcsin(np.sqrt((s-c)/(2*a)))
return alpha - beta - (np.sin(alpha)-np.sin(beta)) - np.sqrt(mu/a**3)*dt
a0 = max(s/2, (s-c)/2)
a = brentq(f, a0, 10*a0)
修改强>
澄清brentq(f,a,b)
的工作方式是,它会在f
间隔内搜索[a,b]
的零。在此,我们知道a
至少是max(s/2, (s-c)/2)
。我只是猜测10次这是一个看似合理的上限,并且对于给定的参数起作用。更一般地说,您需要确保f
和a
之间的b
更改符号。您可以在SciPy docs。
答案 1 :(得分:2)
我认为在试图解决它之前,它值得检查函数的行为。如果不这样做,你就不知道是否有独特的解决方案,许多解决方案,或者没有解决方案。 (最大的问题是许多解决方案,数值方法可能无法为您提供您需要/期望的解决方案 - 如果您盲目地使用它,可能会发生“坏事”)。您可以使用scipy和ipython很好地检查行为。这是一个做这个的示例笔记本
# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>
# <codecell>
s = 10014.6
c = 6339.06
mu = 398600.0
dt = 780.0
# <codecell>
def sin_alpha_2(x):
return numpy.sqrt(s/(2*x))
def sin_beta_2(x):
return numpy.sqrt((s-c)/(2*x))
def alpha(x):
return 2*numpy.arcsin( numpy.clip(sin_alpha_2(x),-0.99,0.99) )
def beta(x):
return 2*numpy.arcsin( numpy.clip(sin_beta_2(x),-0.99,0.99) )
# <codecell>
def fn(x):
return alpha(x)-beta(x)-numpy.sin(alpha(x))+numpy.sin(beta(x)) - dt * numpy.sqrt( mu / numpy.power(x,3) )
# <codecell>
xx = numpy.arange(1,20000)
pylab.plot(xx, numpy.clip(fn(xx),-2,2) )
# <codecell>
xx=numpy.arange(4000,10000)
pylab.plot(xx,fn(xx))
# <codecell>
xx=numpy.arange(8000,9000)
pylab.plot(xx,fn(xx))
这表明我们希望找到一个介于8000和9000之间的解决方案。 曲线中约为5000的奇数扭结和约4000的早期解是由于 使arcsin表现所需的剪裁。关于a = 5000,实际上这个等式没有意义。 (确切的值是光线解决方案中给出的a0)。然后,这提供了一个很好的范围,可以与光线解决方案中的技术一起使用。