我得到了曲线C
,我想计算其2点A,B
之间的曲线长度:
f(x) = x² + 2x
C( x,f( x))
A(-2.0,f(-2.0))
B( 0.5,f( 0.5))
所以x=<-2.0,0.5>
如何计算点A,B
之间的曲线长度?
当然我想知道如何在床单上计算它:)
谢谢;)
答案 0 :(得分:0)
这是Python 3代码,它将近似函数图的弧长。它专为连续功能而设计,但没有计算机程序可以进行无限多的计算以获得真实的结果。
"""Compute the arc length of the curve defined by y = x**2 + 2*x for
-2 <= x <= 0.5 without using calculus.
"""
from math import hypot
def arclength(f, a, b, tol=1e-6):
"""Compute the arc length of function f(x) for a <= x <= b. Stop
when two consecutive approximations are closer than the value of
tol.
"""
nsteps = 1 # number of steps to compute
oldlength = 1.0e20
length = 1.0e10
while abs(oldlength - length) >= tol:
nsteps *= 2
fx1 = f(a)
xdel = (b - a) / nsteps # space between x-values
oldlength = length
length = 0
for i in range(1, nsteps + 1):
fx0 = fx1 # previous function value
fx1 = f(a + i * (b - a) / nsteps) # new function value
length += hypot(xdel, fx1 - fx0) # length of small line segment
return length
def f(x):
return x**2 + 2*x
print(arclength(f, -2.0, 0.5, 1e-10))
您可以设置&#34;容差&#34;为了结果。此例程基本遵循{{3}}。它使用连接的线段近似曲线并计算线段的组合长度。段的数量加倍,直到两个连续的长度近似值比给定的容差更接近。在下图中,蓝色部分加在一起,然后是红色部分,依此类推。由于线是两点之间的最短距离,所有近似值和最终答案都将小于真实答案(除非计算中出现舍入或其他错误)。
该代码给出的答案是
4.3052627174649505
微积分的结果,减少到十进制数,是
4.305262717478898
所以我的结果有点低,正如预期的那样,并且在所需的容差范围内。
我的例程确实有一些功能可以减少计算并提高准确性,但可以做更多的事情。询问您是否需要更多,例如答案的微积分封闭形式。警告 - 该答案涉及反双曲正弦函数。
答案 1 :(得分:0)
您可以简单地计算沿曲线的许多n
点,并将它们之间的距离相加,使用许多小线段逼近曲线。这实际上是当点数达到无穷大时如何进行曲线积分。如果没有任何更高的数学运算,我们可以将n
设置为足够大的值并将其添加到O(n)
for循环中。例如,像 C ++ 这样:
#include <math.h>
double f(double x){ return (x*x)+x+x; } // your function
double length(double x0,double x1,int n) // length of f(x) x=<x0,x1>
{
int e;
double x,dx,y,dy,l;
y=f(x0); dx=(x1-x0)/double(n-1); l=0.0; // start y and length
for (e=1,x=x0+dx;e;x+=dx) // loop through whole x range
{
if (x>=x1) { x=x1; e=0; } // end?
dy=y; y=f(x); dy=y-dy; // y=f(x) and dy is y-oldy
l+=sqrt((dx*dx)+(dy*dy)); // add line length
}
return l; // return length
}
像这样使用:
cout << length(-2.0,0.5,10) << endl;
cout << length(-2.0,0.5,100) << endl;
cout << length(-2.0,0.5,1000) << endl;
cout << length(-2.0,0.5,10000) << endl;
cout << length(-2.0,0.5,100000) << endl;
cout << length(-2.0,0.5,1000000) << endl;
当结果开始饱和时停止增加n
,因为你找到了你的解决方案(有一些粗略的错误)这里的结果在我的机器上:
4.57118083390485
4.30516477250995
4.30776425810517
4.30551273287911
4.30528771762491
4.30526521739629
所以我们可以回答一下例如4.305
...
粗略的,如果你用代数计算曲线积分而不是这个,那么你可以在O(1)
得到精确的答案,如果可以粗糙...