⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1008.cpp

📁 求解正弦函数的曲线长度,看到有人传过一个相似的,但是我觉得这个版本比较好.
💻 CPP
字号:
#include <stdio.h>
#include <math.h>
 

double f0( double x, double l, double t )

{

  return sqrt(1.0+l*l*t*t*cos(t*x)*cos(t*x));
//	return l*sin(t*x);
}

 

double Integral(double a, double b, double (*f)(double x, double y, double z), 

double eps, double l, double t);

 

int main()

{

    double a=0.0, b, eps=0.005, l, t;

 

    while (scanf("%lf %lf %lf", &l, &b, &t) != EOF)

       printf("%f\n", Integral(a, b, f0, eps, l, t));

    return 0;

}

 

/* Your function will be put here */
#define MaxNum 100
#define PI 3.14159265358979

double SubIntegral(double a, double b, double (*f)(double x, double y, double z), double eps, double l, double t)
{
	double R1[MaxNum];
	double R2[MaxNum];
	double h;
	double tmpSum, tmp;
	double err;
	int i,j,k;
	int power2=1;
	int power4;
	bool accurate=false;

	h=b-a;
	R1[1]=h*(f(a,l,t)+f(b,l,t))/2.0;
	
	for( i=2; i<MaxNum; i++, power2=power2*2 )
	{
		tmpSum=0.0;
		for ( k=1; k<=power2; k++ )
		{
			tmp=a+((double)k-0.5)*h;
			tmpSum+=f(tmp,l,t);
		}
		tmpSum=tmpSum*h;
		R2[1]=(R1[1]+tmpSum)/2.0;

		power4=1;
		for ( j=2; j<=i; j++ )
		{
			power4=power4*4;
			R2[j]=R2[j-1]+(R2[j-1]-R1[j-1])/(power4-1);
		}

// 		printf("R2:\n");
// 		for ( j=2; j<=i; j++ )
// 		{
// 			printf("%d: %f\n",j,R2[j]);
// 		}

		h=h/2.0;
		err=fabs(R1[i-1]-R2[i]);
		if ( err<eps/100&&h<1.0&&i>2)
		{
			if ( accurate )
				break;
			else
				accurate=true;
		}
		else
			accurate=false;


		for ( j=1; j<=i; j++ )
			R1[j]=R2[j];
	}
	
	return R2[i];
}

double Integral(double a, double b, double (*f)(double x, double y, double z), double eps, double l, double t)
{
	int N;
	double T;
	double subInt;
	double extraInt;
	double result;

	t = fabs(t);
	b = fabs(b);

	T=PI*2.0/t;
	N=(b-a)/T;

	if ( N==0 )
	{
		result=SubIntegral( a, b, f0, eps, l, t);
	}
	else
	{
		subInt=SubIntegral( a, T+a, f0, eps, l, t)*N;
		if( a+T*N==b )
			extraInt=0.0;
		else
			extraInt=SubIntegral( a+T*N, b, f0, eps, l, t);
		result=subInt+extraInt;
	}

	return result/100.0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -