天天看點

使用C語言實作抛物插值

題目描述

查閱機械設計手冊,找到一個函數數表,編寫程式實作數表的抛物線插值,注明運作時輸入的參數。

查閱到的表如下

使用C語言實作抛物插值

程式

#include<stdio.h>
#include <stdlib.h>
int main()
{
	//将題目中所給資料儲存到數組之中,因為所給範圍為90°-180°,故抛物線插值法隻适用于計算90°-180°範圍内的修正系數 
	float a[16]={90.0,100.0,110.0,120.0,125.0,130.0,135.0,140.0,145.0,150.0,155.0,160.0,165.0,170.0,175.0,180.0};
	float k[16]={0.59,0.74,0.78,0.82,0.84,0.86,0.88,0.89,0.91,0.92,0.93,0.95,0.96,0.98,0.99,1.00};
	float x,y;//x表示輸入的包角,y為輸出的要計算的修正系數。 
	float y1,y2,y3; //分别表示抛物線插值公式中的三項,最後的y=y1+y2+y3。
	int n;
	int flag=0;
	printf("您想要查詢的包角個數為:");
	scanf("%d",&n);
	int j=1;
	while(n--)
	{
		printf("請輸入第%d個包角的大小x:",j);
		scanf("%f",&x);//輸入 
		int i;
		for(i=0;i<16;i++)
		{
			if(x<a[0]||x>a[15])//如果輸入的資料越界,則報錯。 
				flag=1;
			if(x<a[i])
			{
				if(i>1)
				{
					if(x-a[i-1]<a[i]-x)//判斷x是靠近a[i-1]還是a[i]。如果靠近 a[i-1],則i=i-1。若靠近 a[i],i=i。 
					{
						i--;
					}
				}
				break;
			}
			if(i>15)
			{
				i=15;
			}
		}
		j++;
		//抛物線插值公式核心部分	
		y1=((x-a[i])*(x-a[i+1])*k[i-1])/((a[i-1]-a[i])*(a[i-1]-a[i+1]));//公式第一項 
		y2=((x-a[i-1])*(x-a[i+1])*k[i])/((a[i]-a[i-1])*(a[i]-a[i+1]));//公式第二項 
		y3=((x-a[i-1])*(x-a[i])*k[i+1])/((a[i+1]-a[i-1])*(a[i+1]-a[i]));//公式第三項 
		y=y1+y2+y3;//最後的預測值為三項相加	
		if(flag==0)
			printf("包角影響系數為:%.3f\n",y);//保留小數點後三位 
		else
			printf("對不起,您所輸入的角度不在90°—180°範圍内\n");	
	} 
}
           

結果

使用C語言實作抛物插值

本題考察的知識為函數的插值

使用C語言實作抛物插值
使用C語言實作抛物插值
使用C語言實作抛物插值