拉格朗日插值法 C語言實現

/*
*做者:KDF5000
*功能:利用拉格朗日插值法求解近似值
*時間:2013.4.15
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//存放插值節點
struct Data{
	double x;
	double y;
	struct Data *next;
};
/****************************************************
*LagrangeInsert()
*功能:拉格朗日插值法
*****************************************************/
double LagrangeInsert(struct Data *header,double x)
{
	Data *pi,*pj,*p;
	pi=pj=header->next;
	double temp1,temp2;
	temp1=0;                //記錄內循環的積
	temp2=1;				//記錄外循環的和
	while(pi!=NULL)
	{
		while(pj!=NULL)
		{
			if(pi!=pj)
				temp2 *=(x-pj->x)/(pi->x-pj->x);
			pj = pj->next;
		}
		temp1 +=temp2*pi->y;
		temp2=1;
		pj = header->next;
		pi = pi->next;
	}
	return temp1;   //返回計算結果
}

void main()
{
	Data *header = (Data *)malloc(sizeof(Data));
	char str[20];
	Data *p,*newData;
	char strx[20],stry[20];
	double x;

	p=header;
	p->x=0;
	p->y=0;
	p->next=NULL;

	//輸出提示信息
	printf("*******************************************\n");
	printf("使用說明:\n1.用戶輸入插值點,每一行輸入一組:x y;\n2.輸入換行表示輸入結束。\n");
	printf("*******************************************\n");
	printf("x    y\n");

	//接收用戶輸入知道第一次輸入非換行爲止
	memset(str,0,sizeof(str));
	while(strlen(str)==0)
     	gets(str);
	//數據輸入完畢,輸入換行結束輸入
	while(strlen(str)!=0)
	{
		newData = (Data *)malloc(sizeof(Data));
		sscanf(str,"%s%s",strx,stry);     //獲取輸入的前兩個字符串 第一個爲x,第二個爲y
		newData->x = strtod(strx,NULL);   //將輸入轉換成浮點數
		newData->y = strtod(stry,NULL);   
		newData->next=NULL;
		p->next=newData;
		p = p->next;
		gets(str);
	}
	printf("請輸入要計算的x值:");
	scanf("%lf",&x);
	printf("L(%f) = %f\n",x,LagrangeInsert(header,0.20));
	return ;
}
相關文章
相關標籤/搜索