2017-07-07 69 views
1

在另一个thread,我看见有人设法利用mathematica.They一个圆弧的长度整合写道:如何使用python,numpy和scipy集成弧长?

In[1]:= ArcTan[3.05*Tan[5Pi/18]/2.23] 
Out[1]= 1.02051 
In[2]:= x=3.05 Cos[t]; 
In[3]:= y=2.23 Sin[t]; 
In[4]:= NIntegrate[Sqrt[D[x,t]^2+D[y,t]^2],{t,0,1.02051}] 
Out[4]= 2.53143 

究竟怎么会这样使用numpy的的进口和SciPy的被转移到Python?特别是,我在“NIntegrate”函数的代码中卡在第4行。谢谢您的帮助!另外,如果我已经有了弧长和垂直轴长度,我将如何能够反转程序以从已知值中吐出原始参数?谢谢!

回答

3

据我所知scipy不能执行符号计算(如符号差异)。您可能想看看http://www.sympy.org的符号计算包。因此,在下面的示例中,我分析计算了导数(Dx(t)Dy(t)函数)。

>>> from scipy.integrate import quad 
>>> import numpy as np 
>>> Dx = lambda t: -3.05 * np.sin(t) 
>>> Dy = lambda t: 2.23 * np.cos(t) 
>>> quad(lambda t: np.sqrt(Dx(t)**2 + Dy(t)**2), 0, 1.02051) 
(2.531432761012828, 2.810454936566873e-14) 

编辑:问题的第二部分 - 反相问题

从你知道的积分(ARC)的值,事实上,你现在可以解决对于确定的参数一个圆弧(半轴,角度等)假设您想要求解角度。然后,您可以使用scipy中的一个非线性求解器来恢复方程quad(theta) - arcval == 0。你可以这样说:

>>> from scipy.integrate import quad 
>>> from scipy.optimize import broyden1 
>>> import numpy as np 
>>> a = 3.05 
>>> b = 2.23 
>>> Dx = lambda t: -a * np.sin(t) 
>>> Dy = lambda t: b * np.cos(t) 
>>> arc = lambda theta: quad(lambda t: np.sqrt(Dx(t)**2 + Dy(t)**2), 0, np.arctan((a/b) * np.tan(np.deg2rad(theta))))[0] 
>>> invert = lambda arcval: float(broyden1(lambda x: arc(x) - arcval, np.rad2deg(arcval/np.sqrt((a**2 + b**2)/2.0)))) 

然后:

>>> arc(50) 
2.531419526553662 
>>> invert(arc(50)) 
50.000031008458365 
+0

非常感谢你的回复!我很抱歉,但最后我只有一个关于四功能的简单问题。如果我已经具有2.5314327的弧长,我将如何能够在代码中反转该功能?谢谢! –

+0

@FairlyFactual你是什么意思的“扭转”?这是一个确定的积分。我想你想解决方程'四(某事)== 2.53 ...'。问题是:你想要解决什么? –

+0

@FairlyFactual我加入了我的尝试,以解决你的“逆向问题”的方式来理解我的答案。 –

相关问题