我正在尝试导出任意曲线的长度。
我从一个简单的例子开始,一个半径为 R 的圆。我得到了错误的结果!
结果似乎与 R 的真实结果有所不同,这可能会给问题带来一些提示。
以下代码:
from scipy.integrate import quad
from scipy.misc import derivative
import numpy as np
r = lambda t: 1
x = lambda t: r(t)*np.cos(t)
Dx = lambda t: derivative(x, t)
y = lambda t: r(t)*np.sin(t)
Dy = lambda t: derivative(y, t)
print(quad(lambda t: np.sqrt(Dx(t)**2 + Dy(t)**2), 0, 2*np.pi))
结果
(5.287118128162912, 5.869880279799524e-14)
对于 R=1,它应该是 2*pi = 6.28...
对于 R=5,它是
(26.435590640814564, 2.9349401398997623e-13)
有什么建议吗?
最佳答案
导数
的文档字符串表示“使用带间距的中心差分公式
dx”
,以及dx<的默认值
是 1,这个值太大了,无法期望得到函数导数的精确近似值。例如,尝试dx=1e-8
。
使用您的代码,但将 Dx
和 Dy
更改为
In [21]: Dx = lambda t: derivative(x, t, dx=1e-8)
In [22]: Dy = lambda t: derivative(y, t, dx=1e-8)
这是我得到的:
In [23]: print(quad(lambda t: np.sqrt(Dx(t)**2 + Dy(t)**2), 0, 2*np.pi))
(6.283185278344876, 1.7738885483822232e-08)
关于python - 使用 scipy 得到错误的弧长结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46381798/