如何计算数学函数曲线的长度?

时间:2017-09-07 13:50:51

标签: math geometry 2d curve

我得到了曲线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>

img

如何计算点A,B之间的曲线长度? 当然我想知道如何在床单上计算它:)

谢谢;)

2 个答案:

答案 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

所以我的结果有点低,正如预期的那样,并且在所需的容差范围内。

我的例程确实有一些功能可以减少计算并提高准确性,但可以做更多的事情。询问您是否需要更多,例如答案的微积分封闭形式。警告 - 该答案涉及反双曲正弦函数。

mathematical definition of the length of an arc

答案 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)得到精确的答案,如果可以粗糙...