问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

利用c++编程三次样条插值,题目如下

发布网友 发布时间:2022-05-06 18:54

我来回答

1个回答

热心网友 时间:2023-09-11 06:39

#include"stdio.h"
#include"math.h"
const double PI = 3.141592654;
const double R=PI/180; //定义常量(角度转弧度的因子)。
double *m(double *y,int length,double j); ////m法////
double *jinsi(double y[],double g[],double a); ///求给定间隔的函数近似值///
double *jifen(double y[],double g[],double a,double b);//求第一象限内的积分
void main()
{
/////给定已知条件////
int a; //给定间隔(角度值a)
double y[361],*p,*q; //定义名为y的数组存储函数值,下标及对应角度
double* y1, * y2,*y3,*y4;
double f1[361],f2[361];
printf("请输入已知sin函数表的间隔a:");
scanf("%d",&a); //就是h (等间距)
for(int i=0;i<=360/a;i++)
{
if(i*a%180==0)
y[i]=0.0;
else y[i]=sin(R*i*a);//存储函数值
}
p=y;
y1=m(p,360/a+1,R*a); //用m法求一阶导(1~n-1)
for(i=0;i<=360/a;i++)
{
f1[i]=*(y1+i);
}
///打印///
printf("角度值\t|函数值\t|一阶导数值\t\n");
for(i=0;i<=360/a;i++)
{
if(i/10==0) printf("%d | %f | %f\n",i*a,y[i],f1[i]);
else if(i/100==0) printf("%d | %f | %f\n",i*a,y[i],f1[i]);
else printf("%d | %f | %f\n",i*a,y[i],f1[i]);
}
}
////m法////
double *m(double *y,int length,double j)
{
int n=length-1;
double g1[361];
for(int i=1;i<n;i++)
{
g1[i]=(*(y+i+1)-*(y+i-1))*3/(j*2);
}
g1[0]=1;
g1[n]=1;
g1[1]-=0.5*g1[0];
g1[n-1]-=0.5*g1[n];
double a[360];
double c[360];
double d[360];
for(i=0;i<=n;i++)
{
a[i]=0.5;
d[i]=2;
c[i]=0.5;
}
c[1]=c[1]/d[1];
g1[1]=g1[1]/d[1];
double t;
for(i=2;i<n-1;i++)
{
t=d[i]-c[i-1]*a[i];
c[i]/=t;
g1[i]=(g1[i]-g1[i-1]*a[i])/t;
}
g1[n-1]=(g1[n-1]-g1[n-2]*a[n-1])/(d[n-1]-c[n-2]*a[n-1]);
for(i=n-2;i>=1;i--)
{
g1[i]=g1[i]-c[i]*g1[i+1];
}
return g1;
}
///求近似函数值//
double *jinsi(double y[],double g[],double a)//a为弧度值
{
int i=0,j=0;
double f[361];
for(i=0;i<360*R/a;i++)
{
for(j=0;j<a/R;j++)
{
double x,s,a1,a2,b1,b2;
x=i*a+j*R;//变为弧度制
a1=(1+2*(x-a*i)/a)*(x-a*(i+1))*(x-a*(i+1))/a/a;
a2=(1-2*(x-a*(i+1))/a)*(x-a*i)*(x-a*i)/a/a;
b1=(x-a*i)*(x-a*(i+1))*(x-a*(i+1))/a/a;
b2=(x-a*(i+1))*(x-a*i)*(x-a*i)/a/a;
s=a1*y[i]+y[i+1]*a2+g[i]*b1*g[i+1]*b2; //间隔为10的样条表达式
f[i*10+j]=s;
}
}
f[360]=0;
return f;
}
double *jifen(double y[],double g[],double a,double b)//a为弧度值
{ int i=0,j=0;
double sum=0;
for(i=0;i<PI/2/a;i++)
{
for(j=0;j<a/R;j++)
{
double x,s,a1,a2,b1,b2;
x=i*a+j*R;//变为弧度制
a1=(1+2*(x-a*i)/a)*(x-a*(i+1))*(x-a*(i+1))/a/a;
a2=(1-2*(x-a*(i+1))/a)*(x-a*i)*(x-a*i)/a/a;
b1=(x-a*i)*(x-a*(i+1))*(x-a*(i+1))/a/a;
b2=(x-a*(i+1))*(x-a*i)*(x-a*i)/a/a;
s=a1*y[i]+y[i+1]*a2+g[i]*b1*g[i+1]*b2; //间隔为10的样条表达式
sum+=s*R;
}
}
printf("第一象限内的积分值为:%f/n",sum);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
冠心病头疼头胀是要犯病吗 头疼是冠心病导致的吗 冠心病会头疼,昏昏沉沉的吗 冠心病导致头痛的原因是什么 小番茄为何又叫圣女果? 兴业信用卡境外取现怎么收费? Win10系统电脑死机显示dcom错误1068怎么办dcom遇到错误1068导致死机 win10系统dcom遇到错误1068导致死机怎么办 win10系统dcom遇到错误1068导 ... 刮毛好不好 我脸部的小汗毛曾经用剃眉刀刮过,现在又长长拉,好像也变粗拉,怎么... 三次样条插值 C++程序 我的家庭条件不好,男友因此和我分手,我该怎么办? 求助:求三次样条插值函数的C++程序 你为什么不愿意结婚? 三次样条插值C语言 C语言实现三次样条插值的子函数 三次样条插值用c语言具体怎么做 东方丽城怎么样?好不好?值不值得买? 南通市通州区平潮镇家里甲醛可以上门检测? 通州有没有适合晨跑的地方 莆田新房装修测甲醛含量找什么部门 南通盛通绿植租赁有限公司怎么样? 通州有没有好点的除甲醛公司 北京通州全国最大的门票700元游玩 通州区复兴庄的口袋公园在哪里 通州有做绿植花卉租摆公司吗? 谁给提几个寓意吉祥且不常见的字? 解绑个人名字银行卡? SAP里的FICO是两个模块吗?那找工作也是找FI和CO两个方面的工作吗? 求问如何才能成为一名好的FICO顾问? 求:拉格朗日插值和三次样条插值的程序,要c语言 三次样条插值计算步骤 三次样条插值 的c代码,想用MATLAB中的interp2的函数,一定要是C代码非C++。 三次样条插值 谁来帮帮我啊:运用三次样条插值函数法对一条已知的折线进行圆滑(编程实现)。 请问谁会三次样条插值 c++的,知道原理,但谁有源码看看 三次样条插值法程序的哪位大虾帮忙写下阿 急求二维矩阵三次样条插值的程序,要C或C++语言。望有注释!谢谢! 邮箱lsmann9@hotmail.com 谁能帮忙弄个三次样条插值函数的C语言程序或者VB程序 数值方法 三次样条插值 三次样条插值 三次样条拟合 请植物专家解答问题,这种植物叫什么名字,长在路边,红色茎是四方的,开紫色小花,以图为证,高分悬赏。 有电信手机号能查绑定的座机号吗 电信手机打电话如何显示座机号码? 办理的电信手机卡号怎么显示座机号 秦岭山里路边紫色的小花 在路边看到这种花,是种有蛋糕味紫色小花,五个花瓣,淡紫色 奥瑞康的介绍 深圳市奥瑞康精工有限公司怎么样? 奥瑞康国际贸易(北京)有限公司怎么样?