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

📄 question.h

📁 数值分析 一个上学的时候经常会到的小小的程序。希望对大家有一点的帮助。
💻 H
字号:
#include "function.h"
void newton4()
{
	double  c=-1;
	 int n=-1;
	    while(c<=0)
		{
			cout<<"请输入底数!"<<endl;
			 cin>>c;
		}
		while(n<0)
		{
			cout<<"请输入指数的倒数!"<<endl;
			 cin>>n;
		}
		 if(n==0)
		 {
			 cout<<c<<"开"<<n<<"次方为:"<<1.0<<endl;
			 return ;
		 }
		  else
		  {
			 double x0=(c+n-1)*1.0/n,x1=x0;
			  do
			  {
				 x0=x1;
				  double x0bak=1.0;
				   for(int i=0;i<n-1;i++)
					   x0bak*=x0;
				    x1=x0-(x0bak*x0-c)/(n*x0bak);
			  }while(fabs(x1-x0)>dps);
			  cout<<c<<"开"<<n<<"次方为:"<<(x1+x0)/2<<endl;
		  }
}		
void qingjiuzhao1()
{
	int size=-1;
	 while(size<0)
	 {
		 cout<<"请输入多项式的最高次幂!"<<endl;
		  cin>>size;
	 }
	 double x,*ch=new double[size+1];
	 cout<<"请输入全部的系数(从低次幂到高次幂)!("<<size+1<<"个)"<<endl;
	  for(int i=0;i<=size;i++)
		   cin>>ch[i];
	  cout<<"请输入x的值!"<<endl;
	   cin>>x;
	    double s=ch[size];
		 for(i=size-1;i>=0;i--)
		 {
			 s*=x;
			  s+=ch[i];
		 }
		 cout<<"多项式:";
		  for(i=size;i>0;i--)
		  {
			  cout<<ch[i]<<"*"<<x<<"^"<<i<<"+";
		  }
		   cout<<ch[0]<<"="<<s<<endl;
		    delete []ch;
}
void getsolution6()
{
	int n=-1;
	 while(n<=0)
	 {
	    cout<<"请输入变元的个数!"<<endl;
	      cin>>n;
	 }
	 double **ch;
	  make2darray(ch,n,n+1);
	   cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
	    for(int i=0;i<n;i++)
		   for(int j=0;j<=n;j++)
				cin>>ch[i][j];
		          show(ch,n,n,0);
		   for(i=0;i<n;i++)
		   { //选取主元素
			   int maxflag=i;
			   for(int j=maxflag+1;j<n;j++)
				   if(fabs(ch[j][i])>fabs(ch[maxflag][i]))
					   maxflag=j;
				   if(fabs(ch[i][maxflag])<dps)
				   {
					   cout<<"有多余的方程存在!有很多解!"<<endl;
					    return;
				   }
				   if(maxflag!=i)
					   for(j=i;j<=n;j++)
						   swap(ch[maxflag][j],ch[i][j]);
				    //开始消元
				   for(j=i+1;j<n;j++)
				   {
					  double temp=ch[j][i]/ch[i][i];
					   for(int k=i;k<=n;k++)
						   ch[j][k]=ch[j][k]-ch[i][k]*temp;
				   }
		   }
			    show(ch,n,n,1);
					 //开始求解*/
					   ch[n-1][n]/=ch[n-1][n-1];
					   for(i=n-2;i>=0;i--)
					   {
						   for(int j=i+1;j<n;j++)
							   ch[i][n]-=ch[i][j]*ch[j][n];
						    ch[i][n]/=ch[i][i];
					   }
					   cout<<"方程的解为:"<<endl;
					    for(i=0;i<n;i++)
							cout<<"Y"<<i+1<<"="<<ch[i][n]<<endl;
						      delete2darray(ch,n);
}
void jacobi5()
{
	int n=-1,num=0,needchange=0;
	 double flag=0;
	 while(n<=0)
	 {
	    cout<<"请输入变元的个数!"<<endl;
	      cin>>n;
	 }
	 double **ch,*x=new double[n],maxgap=2,*xbak=new double[n];
	  make2darray(ch,n,n+1);
	   cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
	    for(int i=0;i<n;i++)
		   for(int j=0;j<=n;j++)
				cin>>ch[i][j];
		         show(ch,n,n,0);
		   for(i=0;i<n;i++)
			   if(fabs(ch[i][i])<dps)
			   {
				   needchange=1;
				    int success=0;
				     for(int j=0;j<n&&success==0;j++)
						 if(i!=j&&fabs(ch[i][j])>dps)
							 for(int k=0;k<n&&success==0;k++)
								 if(fabs(ch[k][i])>dps)
								 {
									 for(int p=0;p<=n;p++)
										 swap(ch[k][p],ch[i][p]);
									       success=1;
								 }
								 if(success==0)
								 {
									 cout<<"此方程应该没有唯一解或者方程有问题!"<<endl;
									  return;
								 }
			   }
			   if(needchange)
			   {
				   cout<<"输入方程组无法直接解,经过变换如下:"<<endl;
				   show(ch,n,n,0);
			   }
		   for(i=0;i<n;i++)
		   {
			   for(int j=0;j<n;j++)
				   if(i!=j)
					   ch[i][j]/=-ch[i][i];
				   ch[i][n]/=ch[i][i];
		   }
			  showdiedai(ch,n,n);
		   for(i=0;i<n;i++)
			    xbak[i]=0;
		    while(maxgap>dps&&flag<maxsize&&num<maxsize)
			{
				for(i=0;i<n;i++)
				{
					x[i]=0;
					for(int j=0;j<n;j++)
						if(i!=j)
							x[i]+=ch[i][j]*xbak[j];
						x[i]+=ch[i][n];
				}
				 maxgap=0;
				  for(i=0;i<n;i++)
					  if(maxgap<fabs(x[i]-xbak[i]))
						  maxgap=fabs(x[i]-xbak[i]);
					  	for(i=0;i<n;i++)
				        	xbak[i]=x[i];
						      if(flag<maxgap)
								  flag=maxgap;
							        num++;
			}
			if(flag>=maxsize||num>=maxsize)
				cout<<"迭代过程不收敛!此方法失效!"<<endl;
			 else
			 {
			cout<<"方程的解为:"<<endl;
			 for(i=0;i<n;i++)
				 cout<<"X"<<i+1<<"="<<xbak[i]<<endl;
			 }
			 delete2darray(ch,n);
			  delete []x;
			   delete []xbak;
}
void g_s5()
{
	int n=-1,num=0,needchange=0;
	 double max=0;
	 while(n<=0)
	 {
	    cout<<"请输入变元的个数!"<<endl;
	      cin>>n;
	 }
	 double **ch,*x=new double[n],maxgap=2;
	  make2darray(ch,n,n+1);
	   cout<<"请输入方程组的增广矩阵!("<<n<<"*"<<n+1<<")"<<endl;
	    for(int i=0;i<n;i++)
		   for(int j=0;j<=n;j++)
				cin>>ch[i][j];
		          show(ch,n,n,0);
		   for(i=0;i<n;i++)
			   if(fabs(ch[i][i])<dps)
			   {
				   needchange=1;
				    int success=0;
				     for(int j=0;j<n&&success==0;j++)
						 if(i!=j&&fabs(ch[i][j])>dps)
							 for(int k=0;k<n&&success==0;k++)
								 if(fabs(ch[k][i])>dps)
								 {
									 for(int p=0;p<=n;p++)
										 swap(ch[k][p],ch[i][p]);
									       success=1;
								 }
								 if(success==0)
								 {
									 cout<<"此方程应该没有唯一解或者方程有问题!"<<endl;
									  return;
								 }
			   }
			   if(needchange)
			   {
				   cout<<"输入方程组无法直接解,经过变换如下:"<<endl;
				   show(ch,n,n,0);
			   }
		   for(i=0;i<n;i++)
		   {
			   for(int j=0;j<n;j++)
				   if(i!=j)
					   ch[i][j]/=-ch[i][i];
				   ch[i][n]/=ch[i][i];
		   }
			   showdiedai(ch,n,n);
		   for(i=0;i<n;i++)
			    x[i]=0;
		    while(maxgap>dps&&max<maxsize&&num<maxsize)
			{
				maxgap=0;
				for(i=0;i<n;i++)
				{
					double  xbak=x[i];
					x[i]=0;
					for(int j=0;j<n;j++)
						if(i!=j)
							x[i]+=ch[i][j]*x[j];
						x[i]+=ch[i][n];
						 if(maxgap<fabs(x[i]-xbak))
							 maxgap=fabs(x[i]-xbak);
				}
				if(max<maxgap)
					max=maxgap;
				      num++;
			}
			if(max>=maxsize||num>=maxsize)
				cout<<"迭代过程不收敛!此方法失效!"<<endl;
			else
			{
			cout<<"方程的解为:"<<endl;
			 for(i=0;i<n;i++)
				 cout<<"X"<<i+1<<"="<<x[i]<<endl;
			}
			 delete2darray(ch,n);
			  delete []x;
}
void  jifen3(int select)
{
	if(select>=1&&select<=2)
	{
		int n=-1;
	   while(n<=0)
	   {
		 cout<<"请输入区间等份数!"<<endl;
		  cin>>n;
	   }
	   double result=0,h=(1-0)*1.0/n;
	 if(select==1)
	 {
	  for(int k=0;k<n;k++)
		  result+=1.0/(1+k*k*h*h)+1.0/(1+h*h*(k+1)*(k+1));
		    result=result*h/2;
			 cout<<"等分"<<n<<"份的梯形公式求积结果为:"<<result<<"  (0.78539816)"<<endl;
	 }
	 else
		 {
			 for(int k=0;k<n;k++)
				 result+=1.0/(1+k*k*h*h)+1.0/(1+h*h*(k+1)*(k+1))+4.0/(1+h*h*(k+0.5)*(k+0.5));
			       result=result*h/6;
				    cout<<"等分"<<n<<"份的simpson求积结果为:"<<result<<"  (0.78539816)"<<endl;
		 }
	}
	 else
			 if(select==3)
			 {
			   double h=1;
				double t1=h*(1.0/1+1.0/(1+h*h))/2,t2=-1,gap=1;
				 int block=1,step=0;
				 while(gap>dps)
				 {
					 t2=t1/2;
					  double temp=0;
					   for(int k=0;k<block;k++)
						   temp+=1.0/(1+h*h*(k+0.5)*(k+0.5));
					    temp=temp*h/2;
						 t2+=temp;
						  block*=2;
						   h/=2;
						    gap=fabs(t1-t2);
							 t1=t2;
							  step++;
				 }
				 cout<<"用变步长的梯形公式求得结果为:"<<t2<<" (0.78539816)--step="<<step<<endl;
			 }
}
void newton2()
{
	int n=-1;
	 while(n<=0)
	 {
		 cout<<"请输入已知点对的个数!"<<endl;
		  cin>>n;
	 }
	 double **ch,*x=new double[n],*y=new double[n],x0,result=0,addx,addy;
	  make2darray(ch,n,n);
	   cout<<"请输入"<<n<<"个点对的值!(先x后y)"<<endl;
	    for(int i=0;i<n;i++)
			cin>>x[i]>>y[i];
		for(i=0;i<n;i++)
			ch[i][0]=y[i];
		 for(i=1;i<n;i++)//i为列
			 for(int j=i;j<n;j++)
				 ch[j][i]=(ch[j][i-1]-ch[j-1][i-1])/(x[j]-x[j-1]);
		    cout<<"各个差商计算如下:"<<endl;
			 for(i=0;i<n;i++)
				 cout<<"C"<<i<<"="<<ch[i][i]<<endl;
			       showju(ch,x,n);
			  cout<<"牛顿插值公式为:"<<endl;
			   cout<<"f(x)=";
			    for(i=0;i<n;i++)
				{
				  if(fabs(ch[i][i])>dps)
				  {
					  if(fabs(ch[i][i]-1)>dps)
					    cout<<ch[i][i];
					   else
						   if(fabs(ch[i][i]+1)<dps)
							   cout<<"-";
				        	for(int j=0;j<i;j++)
							{
								cout<<"(x";
								 if(x[j]>0)
									 cout<<"-";
								  else
									  cout<<"+";
								 cout<<fabs(x[j])<<")";
							}
					            if(i<n-1&&fabs(ch[i+1][i+1])>dps&&ch[i+1][i+1]>0)
							      cout<<"+";
				  }
				}
				cout<<'\b'<<endl;
				cout<<"请输入你要计算x点的值!"<<endl;
				 cin>>x0;
				  for(i=0;i<n;i++)
				  {
					  double temp=ch[i][i];
					   for(int j=0;j<i;j++)
						  temp*=x0-x[j];
					    result+=temp;
				  }
				  cout<<"有上述公式计算x="<<x0<<"的y="<<result<<endl;
				cout<<"请输入新增加节点的坐标(x,y)"<<endl;
				 cin>>addx>>addy;
				  double *newx=new double[n+1],**newch;
				  make2darray(newch,n+1,n+1);
				   for(i=0;i<n;i++)
				   {
					   newx[i]=x[i];
						 for(int j=0;j<=i;j++)
							 newch[i][j]=ch[i][j];
				   }
				   newx[n]=addx;
				    newch[n][0]=addy;
					 delete []x;
					  delete []y;
					   delete2darray(ch,n);
					    for(i=1;i<=n;i++)
							newch[n][i]=(newch[n][i-1]-newch[n-1][i-1])/(newx[n]-newx[n-1]);
						      showju(newch,newx,n+1);
					         	cout<<"C"<<n+1<<"="<<newch[n][n]<<endl;
						 delete []newx;
						  delete2darray(newch,n+1);
}

⌨️ 快捷键说明

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