分段抛物线插值

先输入数据 两个两个的输,中间用空格隔开,比如
please input data1: 11 11.08然后回车
依次输入完五组数据
完了你想查某个温度的溶解度,他要求你输入温度你输入11.5
它就输出对应的溶解度,然后他提示你是否继续查溶解度,是就输入y,想结束程序
就输入n.

#include<stdio.h>
#include<stdlib.h>
#define NUMBER 5
typedef struct
{
double x;
double y;
}Point;
double * parabola(Point*, Point*, Point*);
double calculate(double* , double );
int main()
{
double x = 0, y = 0;
double* f = NULL;
int i = 0, n = 0;//n为要插的中间那个点的位置
char c = 'y';
Point p[NUMBER];
for(i = 0; i < NUMBER; i++)
{
printf("Please input the point%d:", i+1);
scanf("%lf%lf", &p[i].x, &p[i].y);
while(10 != getchar())
{
continue;
}
}
while('n' != c)
{
printf("Please input the temperature:");
scanf("%lf", &x);
while(10 != getchar())
{
continue;
}
//计算插值点的位子
if(2 * x <= (p[1].x + p[2].x)) n = 1;
else if(2 * x >= (p[NUMBER-2].x + p[NUMBER-1].x)) n = NUMBER - 2;
else n = (int)NUMBER / 2;
printf("%d\n", n);
f = parabola(&p[n-1],&p[n],&p[n+1]);//计算抛物线方程
y = calculate(f,x);//计算溶解度
printf("The solubility at this temperature is %lf\n", y);
printf("Continue?(y/n) ");
scanf("%c", &c);
while(10 != getchar())
{
continue;
}
//释放内存
free(f);
}

return 0;
}

//下面为计算抛物线方程的函数
//设抛物线函数为y = a * x^2 + b * x + c
//以下f[0]为a,f[1]为b,f[2]为c
double * parabola(Point* p1, Point* p2, Point* p3)
{
double temp1 = 0, temp2 = 0;
double * f = NULL;
f = (double*)calloc(3,sizeof(double));
if(NULL == f)
{
printf("Calloc failed!\n");
return NULL;
}
temp1 = (p2->y - p1->y)/(p2->x - p1->x);
temp2 = (p3->y - p2->y)/(p3->x - p2->x);
f[0] = (temp2 - temp1)/(p3->x - p1->x);
f[1] = temp1 - f[0] * (p1->x + p2->x);
f[2] = p1->y - p1->x * (p1->x * f[0] + f[1]);
return f;
}

//根据温度计算溶解度
double calculate(double* f, double x)
{

double y;
y = x * (f[0] * x + f[1]) + f[2];
return y;
}






//这里是第二个程序
#include<stdio.h>
#include<stdlib.h>
#define NUMBER 5
typedef struct
{
double x;
double y;
}Point;
double parabola(Point*, Point*, Point*, double);
int main()
{
double x = 0, y = 0;
int i = 0, n = 0;//n为要插的中间那个点的位置
char c = 'y';
Point p[NUMBER];
for(i = 0; i < NUMBER; i++)
{
printf("Please input the data%d:", i+1);
scanf("%lf%lf", &p[i].x, &p[i].y);
while(10 != getchar())
{
continue;
}
}
while('n' != c)
{
printf("Please input the temperature:");
scanf("%lf", &x);
while(10 != getchar())
{
continue;
}
//计算插值点的位子
if(2 * x < (p[1].x + p[2].x)) n = 1;
else if(2 * x > (p[NUMBER-2].x + p[NUMBER-1].x)) n = NUMBER - 2;
else n = (int)NUMBER / 2;
//printf("%d\n", n);
y = parabola(&p[n-1],&p[n],&p[n+1],x);
printf("The solubility at this temperature is %lf\n", y);
printf("Continue?(y/n) ");
scanf("%c", &c);
while(10 != getchar())
{
continue;
}
}

return 0;
}


//直接套用公式计算溶解度
double parabola(Point* p1, Point* p2, Point* p3, double x)
{
double temp1 = 0, temp2 = 0, temp3 = 0, y = 0;
double a = 0, b = 0, c = 0;
temp1 = (p2->y - p1->y) * (x - p1->x);
temp2 = (p3->y - p1->y) * (p2->x - p1->x) - (p2->y - p1->y) * (p3->x - p1->x);
temp3 = (p3->x - p1->x) * (p3->x - p1->x) * (p2->x - p1->x);
y = p1->y + temp1 / (p2->x - p1->x) + temp2 * (x - p1->x) * (x - p2->x) / temp3;
return y;
}

该数值分析软件(Numerical Analysis Software)实现了现代数值分析中的基本计算方法。主要包括线性方程组的数值解法、非线性方程的数值解法、矩阵的特征值及特征向量的计算、插值法与最小二乘法曲线拟合、数值微积分、常微分方程的数值解法,有利于工程技术人员在实际中方便快捷地应用,也可在数值分析计算教学时进行演示,极大地提高其工作效率。软件采用了友好的输入输出方案允许用户按照一定格式输入的随意性,格式详见帮助文档;利用了一定的图形处理技术,直观地显示数据具体信息,通过良好的数学方法与计算机技术的结合,保障数据的可靠性。另外,还可以自定义小数数位和拟合曲线颜色。各部分简介如下: 线性方程组的数值解法: 在自然科学与工程技术中,很多问题的解决常常归结为解线性方程组,如电学中的网络问题,船体数学放样中的建立三次样条函数问题,机械和建筑结构的设计和计算等等。因此,如何利用电子计算机这一强有力的计算工具去求解线性方程组,是一个非常重要的问题。线性方程组的解法分直接(解)法{是指在没有舍入误差的假设下,经过有限步运算即可求得方程组的精确解的方法。}和迭代(解)法{是用某种极限过程去逐步逼近线性方程组精确解的方法,即是从一个初始向量x0出发,按照一定的迭代格式产生一个向量序列xk,使其收敛到方程组A*x=b的解}。该部分就是针对线性方程组求解而设计的,内容包括:线性方程组的直接解法:Gauss消去法、Gauss列主元消去法、Gauss全主元消去法、列主元消去法应用『列主元求逆矩阵、列主元求行列式、矩阵的三角分解』、LU分解法、平方根法、改进的平方根法、追赶法(解三对角)、列主元三角分解法;线性方程组的迭代解法:雅可比迭代法、高斯-塞德尔迭代法、逐次超松驰迭代法;迭代法的收敛性『正定矩阵判断、向量范数、矩阵范数、严格对角站优矩阵判断』。 非线性方程的数值解法: 在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确解了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要解决的问题。该部分就是针对这一问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。 矩阵的特征值及特征向量的计算: 自然科学和工程技术中的许多问题,如振动问题(桥梁或建筑物的振动、机械振动、电磁振动等),物理学中某些临界值的满足等,常常归结为求矩阵的特征值及特征向量。该部分就是针对这一问题而设计的,内容包括:幂法、原点平移法、反幂法、古典雅可比法、雅可比过关法。 插值法与最小二乘法曲线拟合: 在科学研究与工程技术中,常会遇到函数表达式过于复杂而不便于计算,且又需要计算众多点处的函数值;或只已知又实验或测量得到的某一函数y=f(x)在区间[a,b]中互异的n+1个x0,x1,……,xn处的值y0,y1,……,yn,需要构造一个简单函数P(x)作为函数y=f(x)的近似表达式y=f(x)≈P(x),使得P(xi)=f(xi)=yi,(i=0,1,……,n).这类问题就是插值问题,P(x)即称为插值函数。时至今日,随着电子计算机的普及,插值法的应用范围已涉及到了生产、科研、的各个领域。特别是由于航空、造船、精密机械加工等实际问题的需要,更使得插值法在实践与理论上显得尤其重要并得到了进一步发展,尤其是近几十年发展起来的样条(Spline)插值,更获得了广泛的应用。另外,在科学研究与工程技术中,常常需要从一组测量数据(xi,yi)(i=0,1,……,n)处发,寻找变量x与y的函数关系的近似表达式,且是从给定的一组实验数据出发,寻求已知函数的一个逼近函数y=ρ(x),使得逼近函数从总体上来说与已知函数的偏差按某种方法度量能达到最小而又不一定过全部的点(xi,yi),即是最小二乘曲线拟合。该部分就是针对这些问题而设计的,内容包括:线性插值抛物线插值分段线性插值分段线性插值分段抛物线插值、拉格朗日插值多项式、牛顿插值多项式、等距节点插值多项式『牛顿前插公式、牛顿后插公式』、埃尔米特插值、三次样条插值『用节点处一阶导数表示的样条函数(给定两端点处的一阶导数值、给定两端点处的二阶导数值)、用节点处二阶导数表示的样条函数(给定两端点处的一阶导数值、给定两端点处的二阶导数值)』;最小二乘曲线拟合。 数值微积分: 实际问题中常常需要计算定积分。在微积分中,我们熟知,牛顿-莱布尼茨公式是计算定积分的一种有效工具,在理论和实际计算中有很大作用。但在工程计算和科学研究中,经常会遇到被积函数f(x)这样一些函数:(1)被积函数f(x)本身形式复杂,求原函数更为困
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值