2019数值分析实验报告存档

一、插值与拟合
在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
double Newton(double *,double *,double );
void main (void)
{
	double x[3]={1.000000,4.000000,9.000000};
	double y[3]={1.000000,2.000000,3.000000};
	double u;
	printf("请输入预测点x: ");
	scanf("%lf",&u);
	printf("预测点的近似函数值为:%lf",Newton(x,y,u)); 
}
double Newton(double *a,double *b,double p)
{
	double add=0,t1=1;
	double diQuo[2];//差商 
	int i,j,k;
	for(k=0;k<2;k++)
	{
		add=0;
	   	for(i=0;i<=k+1;i++)
      	{
      		t1=1;
	        j=0;
	    	while(j<=k+1)
	    	{
    			if(j!=i)
      			{
     				t1*=(a[i]-a[j]);
	     			j++;
	    		}
	    		else
    			{
	    			j++;
	    			continue;
	    		}
    		}
     		add+=(b[i]/t1);
     	    printf("%lf,",t1);
    	}
    	diQuo[k]=add;
	}
	add=b[0]+diQuo[0]*(p-a[0])+diQuo[1]*(p-a[0])*(p-a[1]);
	return add;
	
}

二、数值积分

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double Trapezoid(double,double,int);//复化梯形公式 
double Simpson(double ,double ,int);//复化辛普生公式 
double Romberg(double );//龙贝格算法 
void main(void)
{
	double a,b,r;
	int n;
	printf("-----------------------------复化梯形公式-------------------------\n"); 
	printf("此程序使用的函数为f(x)=sinx/x"); 
	printf("请输入积分下限a:");
	scanf("%lf",&a);
	printf("\n请输入积分上限b:");
	scanf("%lf",&b);
	printf("请输入划分:");
	scanf("%d",&n);
	printf("复化梯形公式求得函数在%f到%f上的积分值为:%lf\n",a,b,Trapezoid(a,b,n));
	printf("-----------------------------复化辛普生公式-----------------------\n");
	printf("此程序使用的函数为f(x)=sinx/x"); 
	printf("请输入积分下限a:");
	scanf("%lf",&a);
	printf("\n请输入积分上限b:");
	scanf("%lf",&b);
	printf("请输入划分n:");
	scanf("%d",&n);
	printf("复化辛普生公式求得函数在%f到%f上的积分值为:%lf\n",a,b,Simpson(a,b,n));
	printf("-----------------------------龙贝格算法---------------------------\n");
	printf("此程序使用的函数为f(x)=sinx/x"); 
	printf("请输入误差限:");
	scanf("%lf",&r);
    printf("龙贝格算法求得积分值为%lf",Romberg(r));
 } 
double Trapezoid(double a1,double b1,int n2)
{
	double T,x,h,add,fa,fb;
	int i=0;
	add=0;
	h=(b1-a1)/n2;
	fa=1;
	fb=sin(b1)/b1;
	for(i=1;i<=n2-1;i++)
	{
		x=a1+i*h;
		add=add+(sin(x)/x);
	}
	printf("%lf",add);
	T=(h/2)*(fa+2*add+fb);
	return T;
}
double Simpson(double a2,double b2,int n1)
{
	double h,x,add,fa,fb,f1,f2,f3;
	int i;
	h=(b2-a2)/n1;
	add=(h/6)*(1+4*sin(a2+h/2)/(a2+h/2)+sin(a2+h)/(a2+h));
	x=a2+h;
	for(i=1;i<n1;i++)
	{
		f1=sin(x)/x;
		x=x+h/2;
		f2=sin(x)/x;
		x=x+h/2;
		f3=sin(x)/x;
		add+=(h/6)*(f1+4*f2+f3);
	}
	return add;
}
double Romberg(double r1)
{
	double x,h,S,S1,S2,T1,T2,C1,C2,R1,R2;
	int k;
	h=1;
	T1=1;
	k=1;
	do
	{
		S=0;
		x=0+h/2;
		do
		{
			S=S+(sin(x)/x);
			x=x+h;
		}while(x<1);
		T2=T1/2+h*S/2;
		S2=T2+(T2-T1)/3;
		if(k==1)
		{
			k++;
			h=h/2;
			T1=T2;
			S1=S2;
			S=0;
		    x=0+h/2;
		    do
		    {
			    S=S+(sin(x)/x);
			    x=x+h;
		    }while(x<1);
		    T2=T1/2+h*S/2;
		    S2=T2+(T2-T1)/3;
		}
		C2=S2+(S2-S1)/15;
		if(k==2)
		{
			C1=C2;
			k++;
			h=h/2;
			T1=T2;
			S1=S2;
			S=0;
		    x=0+h/2;
		    do
		    {
			    S=S+(sin(x)/x);
			    x=x+h;
		    }while(x<1);
		    T2=T1/2+h*S/2;
		    S2=T2+(T2-T1)/3;
		    C2=S2+(S2-S1)/15;
		}
		R2=C2+(C2-C1)/63;
	    if(k==3)
		{
			R1=R2;
			C1=C2;
			k++;
			h=h/2;
			T1=T2;
			S1=S2;
			S=0;
		    x=0+h/2;
		    do
		    {
			    S=S+(sin(x)/x);
			    x=x+h;
		    }while(x<1);
		    T2=T1/2+h*S/2;
		    S2=T2+(T2-T1)/3;
		    C2=S2+(S2-S1)/15;
		    R2=C2+(C2-C1)/63;
		} 
	}while(fabs(R2-R1)>=r1);
	return R2;
}

三、非线性方程求根迭代法

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double fun1(double x)//定义原函数 
{
    double y;
	y=pow(x,3)-x-1;
	return y;	
} 
double fun2(double x)//定义导函数 
{
	double y;
	y=3*x*x-1;
	return y;
}
void Newton(double x,double R,double N,double M)
{
	int k=0;
	int i;
	double n;
	double x1;
	while(k<N)
	{
		if(fun2(x)==0)
    	{
	    	printf("奇异标志\n");
    		return;
	    }
    	else
    	{
     		i=0;
    		n=1;
    		while(1)
    		{
    			x1=x-n*fun1(x)/fun2(x);
     			printf("%10f\n",x1);
    			if(fabs( fun1(x1) ) < fabs( fun1(x) ) )
     			{
    				break;
    			}
    			else
    			{
    				i++;
    				n=n/2;
     			}
     			if(i>=M)
      			{
    				printf("重新输入迭代初值\n");
     				return;
    			}
	    	}  
		    if(fabs(x1-x)<R)
    		{
    			printf("结果为:%10f\n",x1);
                return;
    		}
    		else
    		{
    			k++;
    			x=x1;
    		}
    	}
	}
	printf("迭代失败\n");
	return;
 } 
void main(main)
{
	double x,r;
	int N1,N2;
	printf("请输入迭代初值:");
	scanf("%f",&x);
	printf("请输入误差限:");
	scanf("%f",&r);
	printf("请输入迭代最大次数:");
	scanf("%d",&N1);
	printf("请输入下山最大次数:");
	scanf("%d",&N2);
	Newton(x,r,N1,N2); 
}
 
 
 
 
 
 
 
 

四、数值微分

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
double Euler(double ,double ,double );
double Euler2(double ,double ,double );
double RungKutta(double ,double ,double );
void main(void)
{
	int i;
    double h=0.1;
    double y1,y2,y3;
	y1=y2=y3=1;
	double x=0.000000;
	printf("y'=y-2x/y   0<x<1\n");
	printf("y(0)=1\n");
	printf("步长h=0.1\n");
	printf("   x        y(四阶龙格) y(欧拉) y(改进欧拉) y(精确)        \n");
	for(i=0;i<10;i++)
	{
		y1=RungKutta(h,x,y1);
		y2=Euler(h,x,y2);
		y3=Euler2(h,x,y3);
		printf("%10f",x+h);
		printf("%10f",y1);
		printf("%10f",y2);
		printf("%10f",y3);
		printf("%10f\n",sqrt(1+2*(x+h)));
		x+=0.100000;
	}
	
}
double Euler(double h,double x0,double y0)
{
	double yn;
	yn=y0+h*(y0-(2*x0/y0));
	return yn;
}
double Euler2(double h,double x0,double y0)
{
	double yp,yc,yn,xn;
	yp=y0+h*(y0-2*x0/y0);
	xn=x0+h;
	yc=y0+h*(yp-2*xn/yp);
	yn=(yp+yc)/2;
	return yn;
}
double RungKutta(double h,double x0,double y0)
{
	double K1=0,K2=0,K3=0,K4=0;
    double yn;
	K1=y0-2*x0/y0;
	K2=y0+h*K1/2-(2*x0+h)/(y0+h*K1/2);
	K3=y0+h*K2/2-(2*x0+h)/(y0+h*K2/2);
	K4=y0+h*K3-2*(x0+h)/(y0+h*K3);
	yn=y0+h*(K1+2*K2+2*K3+K4)/6;
	return yn;
}








  • 6
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
课题一: 线性方程组的迭代法 一、实内容 1、设线性方程组 = x = ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 ) 2、设对称正定阵系数阵线方程组 = x = ( 1, -1, 0, 2, 1, -1, 0, 2 ) 3、三对角形线性方程组 = x = ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 ) 试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。 二、实要求 1、体会迭代法求解线性方程组,并能与消去法做以比较; 2、分别对不同精度要求,如 由迭代次数体会该迭代法的收敛快慢; 3、对方程组2,3使用SOR方法时,选取松弛因子 =0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者; 4、给出各种算法的设计程序和计算结果。 三、目的和意义 1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较; 2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序; 3、体会上机计算时,终止步骤 (予给的迭代次数),对迭代法敛散性的意义; 4、体会初始解 x ,松弛因子的选取,对计算结果的影响。 课题二:数值积分 一、实内容 选用复合梯形公式,复合Simpson公式,Romberg算法,计算 (1) I = (2) I = (3) I = (4) I = 二、实要求 1、 编制数值积分算法的程序; 2、 分别用两种算法计算同一个积分,并比较其结果; 3、 分别取不同步长 ,试比较计算结果(如n = 10, 20等); 4、 给定精度要求 ,试用变步长算法,确定最佳步长。 三、目的和意义 1、 深刻认识数值积分法的意义; 2、 明确数值积分精度与步长的关系; 3、 根据定积分的计算方法,可以考虑二重积分的计算问题。 四、流程图设计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值