ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言实现三次样条插值

2021-01-01 15:02:02  阅读:368  来源: 互联网

标签:lf 样条 插值 MAX scanf C语言 points printf input


#include <stdio.h>


# define MAX_N 20             // 定义(x_i,y_i)的最大的维数  

typedef struct tagPOINT         // 点的结构 
{	double x;
	double y;
} POINT;   

int main ( ) {
	int n;
	int i, k;
	POINT points[MAX_N + 1];
	double h[MAX_N + 1], b[MAX_N + 1], c[MAX_N + 1], d[MAX_N + 1], M[MAX_N + 1];
	double u[MAX_N + 1], v[MAX_N + 1], y[MAX_N + 1];
	double x, p, q, S;
	printf("\nInput n value:");       // 输入插值点的数目  
	scanf ("%d",&n);
	if (n>MAX_N)  {     
		printf ("The input n is larger than MAX_N, please redefine the MAX_N. \n");
		return 1;  
	}   
	if (n<=0)  {     
		printf ("Please input a number between 1 and % d. \n",MAX_N);
		return 1;
	}   
	// 输入插值点(x_i,y_i),M0值和Mn值   
	printf ("Now input the (x_i,y_i),i=0,…,% d:\n",n);  
	for (i=0;i<n;i++)  {     
		scanf ("%lf %lf",&points[i].x,&points[i].y);
		printf("%lf %lf\n",points[i].x,points[i].y);
	}
	printf("Now input the M[0] value:");
	scanf("%lf", &M[0]);
	printf("\nNow input the M[n] value:");
	scanf("%lf", &M[n]);
	printf("\nNow input the x value:");      
	//输入计算三次样条插值函数的x值  
	scanf ("%lf",&x);   
	if (x>points[n-1]. x || x<points[0].x)  {    
		printf ("Please input a number between %f and %f. \n",points[0].x,points[n].x);   
		return 1;  
	}   
	// 计算M关系式中各参数的值  
	h[0]=points[1].x-points[0].x;  
	for (i=1;i<n;i++ )  {   
		h[i]=points[i+1].x-points[i].x;  
		b[i]=h[i]/(h[i]+h[i-1]);  
		c[i]=1-b[i];
		d[i] = 6 * ((points[i + 1].y - points[i].y) / h[i] - (points[i].y - points[i - 1].y) / h[i - 1]) / (h[i] + h[i - 1]);
	}   
	// 用追赶法计算Mi,i=1,…,n-1  
	d[1]-= c[1]*M[0];  
	d[n-1]-=b[n-1]*M[n]; 
	b[n-1]=0;c[1]=0;v[0]=0;  
	for ( i=1;i<n;i++)  {   
		u[i]=2-c[i]*v[i-1];  
		v[i]=b[i]/u[i];    
		y[i]= (d[i]-c[i]*y[i-1])/u[i]; 
	}  
	for (i=1;i<n;i++)  {   
		M[n-i]=y[n-i]-v[n-i]* M[n-i+1]; 
	}   
	// 计算三次样条插值函数在x处的值 
	k=0;   
	while (x>= points[k].x) k++; 
	k=k-1;
	p=points[k+1].x-x;q=x-points[k].x;  
	S=(p* p* p* M[k] +q* q* q* M[k+1]) / (6* h[k])   +( p* points [k].y+q* points[k+1].y) / h[k]-h[k]*(p* M[k] +q* M[k]+q* M[k+1])/6; 
	printf ("S(%f ) = %f\n",x,S); 
	// 输出 
	getchar ( );
	
	system("pause");
}

标签:lf,样条,插值,MAX,scanf,C语言,points,printf,input
来源: https://blog.csdn.net/qq_42784403/article/details/112060584

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有