C 语言编程 分段抛物线插值已知某气体溶剂在蒸馏水中的饱和溶解度如下 温度T(℃) 11 12 13 14 15溶解度C(mg/L) 11.08 10.83 10.60 10.7 10.15利用 分段抛物线插值 的程序上机计算温度为11.5、12.5、
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/19 13:48:30
C 语言编程 分段抛物线插值已知某气体溶剂在蒸馏水中的饱和溶解度如下 温度T(℃) 11 12 13 14 15溶解度C(mg/L) 11.08 10.83 10.60 10.7 10.15利用 分段抛物线插值 的程序上机计算温度为11.5、12.5、
C 语言编程 分段抛物线插值
已知某气体溶剂在蒸馏水中的饱和溶解度如下
温度T
(℃) 11 12 13 14 15
溶解度C
(mg/L) 11.08 10.83 10.60 10.7 10.15
利用 分段抛物线插值 的程序上机计算温度为11.5、12.5、13.5、14.5℃时该气体溶剂的饱和溶解度.
10.95,10.72,10.48,10.23
用C语言编.
100 分
先谢谢给为了.
楼下的这段程序怎么用呀?
C 语言编程 分段抛物线插值已知某气体溶剂在蒸馏水中的饱和溶解度如下 温度T(℃) 11 12 13 14 15溶解度C(mg/L) 11.08 10.83 10.60 10.7 10.15利用 分段抛物线插值 的程序上机计算温度为11.5、12.5、
我这里有2个程序,第一个用了2个函数
第二个用了1个函数,感觉误差小些
说下用法吧
先输入数据 两个两个的输,中间用空格隔开,比如
please input data1:11 11.08然后回车
依次输入完五组数据
完了你想查某个温度的溶解度,他要求你输入温度你输入11.5
它就输出对应的溶解度,然后他提示你是否继续查溶解度,是就输入y,想结束程序
就输入n.
#include
#include
#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[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
#include
#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;
}
该程序误差绝对小 但结果和你不是完全符合
你的数据好象有点问题 14度的溶解度不太正常