⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 几个数值分析算法的实现 包括三次样条插值、最小二乘法、高斯插值、adam、龙贝格算法等
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
void main()
{
	int n,i;
	double *x,*y,*u,*v,*d,f0,fn,a,*M,*b;
	printf("输入节点个数n:");
	scanf("%d",&n);
	x=(double *)malloc(n*sizeof(double));
	y=(double *)malloc(n*sizeof(double));
	d=(double *)malloc(n*sizeof(double));
	u=(double *)malloc(n*sizeof(double));
	v=(double *)malloc(n*sizeof(double));
	b=(double *)malloc((n-1)*sizeof(double));
	M=(double *)malloc(n*sizeof(double));//根据节点数分配内存
	printf("依次输入节点 x[i] y[i]:");
	for(i=0;i<n;i++)
		scanf("%lf%lf",&x[i],&y[i]);
	for(i=1;i<n-1;i++)
	{
		u[i]=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
		v[i]=1-u[i];
		d[i]=6*((y[i+1]-y[i])/(x[i+1]-x[i])-(y[i]-y[i-1])/(x[i]-x[i-1]))/(x[i+1]-x[i-1]);
	}//求三弯矩方程
	printf("输入边界条件及其类型(1/2) ");
	scanf("%lf%lf%d",&f0,&fn,&i);
	if(i==1)
	{
		d[0]=6*((y[1]-y[0])/(x[1]-x[0])-f0)/(x[1]-x[0]);
		d[n-1]=6*(fn-(y[n-1]-y[n-2])/(x[n-1]-x[n-2]))/(x[n-1]-x[n-2]);
		u[n-1]=1;
		v[0]=1;
	}
	if(i==2)
	{
		d[0]=2*f0;
		d[n-1]=2*fn;
		u[n-1]=0;
		v[0]=0;
	}//处理边界条件
	b[0]=v[0]/2;
	for(i=1;i<n-1;i++)
		b[i]=v[i]/(2-u[i]*b[i-1]);
	v[0]=d[0]/2;
	for(i=1;i<n;i++)
		v[i]=(d[i]-u[i]*v[i-1])/(2-u[i]*b[i-1]);
	M[n-1]=v[n-1];
	for(i=n-2;i>=0;i--)
		M[i]=v[i]-b[i]*M[i+1];//追赶法解方程组
	for(i=0;i<n;i++)
        printf("%lf  ",M[i]);//输出M[i]
	printf("\n三次样条函数S(x) (^表示三次方)");
    for(i=0;i<n-1;i++)
	{
		f0=(6*(x[i+1]-x[i]));
		fn=(y[i]/(x[i+1]-x[i])-M[i]*(x[i+1]-x[i])/6);
        a=(y[i+1]/(x[i+1]-x[i])-M[i+1]*(x[i+1]-x[i])/6);
		printf("\n在区间[%0.2lf  %0.2lf]上\nS(x)=",x[i],x[i+1]);
		printf("%lf(%0.2lf-x)^",M[i]/f0,x[i+1]);
		if(M[i+1]/f0>=0) printf("+");
		printf("%lf(x-%0.2lf)^",M[i+1]/f0,x[i]);
		if(fn>=0) printf("+");
		printf("%lf(%0.2lf-x)",fn,x[i+1]);
		if(a>=0) printf("+");
		printf("%lf(x-%0.2lf)",a,x[i]);
	}//输出函数表达式
}










⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -