📄 常微分方程的初值.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 + -