今天给各位分享三次样条插值程序c语言的知识,其中也会对三次样条插值算法流程图进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
1、利用c++编程三次样条插值,题目如下2、三次样条插值用c语言具体怎么做3、C程高手请求帮忙!计算方法,三次样条插值程序!!4、三次样条插值 C++程序5、三次样条插值C语言
利用c++编程三次样条插值,题目如下
#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;in;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;in-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;i360*R/a;i++)
{
for(j=0;ja/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;iPI/2/a;i++)
{
for(j=0;ja/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;
}
三次样条插值用c语言具体怎么做
void SPL(int n, double *x, double *y, int ni, double *xi, double *yi); 是你所要。
已知 n 个点 x,y; x 必须已按顺序排好。要插值 ni 点,横坐标 xi[], 输出 yi[]。
程序里用double 型,保证计算精度。
SPL调用现成的程序。
现成的程序很多。端点处理方法不同,结果会有不同。想同matlab比较,你需 尝试 调用 spline()函数 时,令 end1 为 1, 设 slope1 的值,令 end2 为 1 设 slope2 的值。
C程高手请求帮忙!计算方法,三次样条插值程序!!
2=6.610;
x3=6.082;
x4=5.607;
x5=5.423;
xH=5.825;
%我这里的版本是2006a的,不知道6.5是否可以通过,你可以自己试试。
x=[x1 x2 x3 x4 x5];
y=[638.3 640.2 650.6 653.2 659.9];%你原来x只有5个元素,而y却有7个元素,所以会出错,我删了最后两个
xi=linspace(x1,x5,100);%这里自动让它平均生成了100个点,如果觉得太多可以自行改少一点
%你下面左引号都是全角中文的,应该换成英文半角状态
ycubic=interp1(x,y,xi,’cubic’);
ylinear=interp1(x,y,xi,’linear’);
yH1=interp1(x,y,xH,’cubic’);
yH2=interp1(x,y,xi,’linear’);
plot(x,y,’*’,xH,yH1,’o’,xi,ycubic,’-‘);
grid on
————————————————————————————
你们老师果然不负责任啊,选课的时候也不说明的。
建议自己找本matlab的教材学习一下,应该还是很好上手的。
三次样条插值 C++程序
#includeiostream.h
#includeiomanip.h
#includemath.h
void main()
{
float a[37],b[37];
cout” “”度数”” “”sin(x)值”” “”一阶导值”” “”二阶导值”endl;
for(int i=0;i37;i++)
coutsetw(11)setprecision(3)
10*i
setw(11)setprecision(3)
sin(i*31.4/180)
setw(11)setprecision(3)
cos(i*31.4/180)
setw(11)setprecision(3)
-sin(i*31.4/180)
endl;
cout”一个周期内的积分值:0″endl;
}
三次样条插值C语言
我记得大三学的计算方法课上有,课后作业实现了的。不过在实验室那个电脑上,如果你有条件的话先参考《数值分析》书上吧。
至于c语言和c++的区别,这个程序应该没什么区别,反正都拿数组做。
关于三次样条插值程序c语言和三次样条插值算法流程图的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。