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

📄 常微分方程的初值.cpp

📁 插值,常微分方程的初值,非线性方程的跟的求解,拟合,微分,线性方程组的求解,积分的实现
💻 CPP
字号:
/////////////////////////////////////////////////////////////////////////////////////////////
#include"myhead.h"
////////////////////////////////////////////////////////////////////////////////////////////
void fun_7()
{
	system("cls");//执行系统清屏命令
	cout<<"	 ******************************************************************"<<endl;
	cout<<"	 *                     常微分方程的初值                           *"<<endl;
	cout<<"	 ******************************************************************"<<endl;
	cout<<"	 *                     1、欧拉公式:                              *"<<endl;
	cout<<"	 *                     2、预报-校正公式:                         *"<<endl;
	cout<<"	 *                     3、龙格-库塔公式:                         *"<<endl;
	cout<<"	 ******************************************************************"<<endl;
	cout<<"	 请选择一个数字(1-3):";
	int ch=0;
	cin>>ch;
	switch(ch)
	{
	case 1:ol();break;
	case 2:yb();break;
	case 3:lgk();break;
	}
	system("pause");
}
/////////////////////////////////////////////////////////////////////////////////////////////
double f(double x,double y)
{
	return (x+y);
}
double  ff(double x)
{
	return(-x-1+2*exp(x));
}
///////////////////////////////////////////////////////////////////////////////////////////////
void yb()
{	int n,i;
	double  a,b,y0,h,c;
	double  k1,k2,y1[20],y2[20];
	cout<<"	 微分方程为y'=x+y"<<endl;
	cout<<"	 请输入X的上界,下界,步长:";
	cin>>a>>b>>h;
	y0=ff(a);
    c=a;
	n=(b-a)/h;
	y1[0]=y0;
	for(i=0;i<=n;i++)
		{k1=f(a,y1[i]);
	     a=a+h;
		 y0=y1[i]+k1*h;
		 k2=f(a,y0);
		 y1[i+1]=y1[i]+(h*(k1+k2))/2;
		}
	for(i=0;i<=n;i++)
		y2[i]=ff(c+i*h);
	cout<<"	 xi         预测-校正法         准确解"<<endl;
	for(i=0;i<=n;i++)
	{cout<<setiosflags(ios::fixed)<<setprecision(5);
		cout<<"	 "<<c+i*h<<"         "<<y1[i]<<"           "<<y2[i]<<endl;
	}
	return;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void ol()
{	int n,i;
	double  a,b,y0,h;
	double  c,x[20],y1[20],y2[20]; 
	cout<<"	 微分方程为y'=x+y"<<endl;
	cout<<"	 请输入X的上界,下界,步长:";
	cin>>a>>b>>h;
	y0=ff(a);
    c=a;
	n=(b-a)/h;
	y1[0]=y0;
	for(i=0;i<=n;i++)
		{x[i]=a+i*h;
		 y1[i+1]=y1[i]+h*f(x[i],y1[i]);
		}
	for(i=0;i<=n;i++)
		y2[i]=ff(c+i*h);
	cout<<"	 xi         欧拉法         准确解"<<endl;
	for(i=0;i<=n;i++)
		{cout<<setiosflags(ios::fixed)<<setprecision(5);
		cout<<"	 "<<c+i*h<<"         "<<y1[i]<<"           "<<y2[i]<<endl;
	}
	return;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void lgk()
{	int n,i,j;
	double  a,b,y0,h,c;
	double  h1,h2,k[5],y1[20],y2[20];
	cout<<"	 微分方程为y'=x+y"<<endl;
	cout<<"	 准确解方程为y=-x-1+2*exp(x)"<<endl;
	cout<<"	 请输入X的上界,下界,步长:";
	cin>>a>>b>>h;
	y0=ff(a);
    c=a;
	n=(b-a)/h;
	h1=h/2;
	h2=h/6;
	y1[0]=y0;
	for(i=0;i<=n;i++)
		{
		k[1]=f(a,y1[i]);
	     a=a+h1;
		 for(j=1;j<=2;j++)
			{
			 y0=y1[i]+k[j]*h1;
			 k[j+1]=f(a,y0);
			}
		 a=a+h1;
		 y0=y1[i]+k[3]*h;
		 k[4]=f(a,y0);
		 y1[i+1]=y1[i]+(k[1]+2*(k[2]+k[3])+k[4])*h2;
		}
	for(i=0;i<=n;i++)
		y2[i]=ff(c+i*h);
	cout<<"	 xi         龙贝格法         准确解"<<endl;
	for(i=0;i<=n;i++)
	{   cout<<setiosflags(ios::fixed)<<setprecision(5);
		cout<<"	 "<<c+i*h<<"         "<<y1[i]<<"           "<<y2[i]<<endl;
	}
	return;
}

⌨️ 快捷键说明

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