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

📄 code10.cpp

📁 ordinary differential equations
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		{
			str.Format("%lf",pt[i].z); 
			table.SetItemText(i,3,str);
		}
	}
}

void CCode10::OnButton()
{
	if (fStatus==1)
	{
		for (int i=1;i<=nInputItems;i++)
			input[i].ed.GetWindowText(input[i].item);
		switch(fMenu)
		{
			case 1:
				ODE1Taylor(); fStatus=2; break;
			case 2:
				ODE1RK2(); fStatus=2; break;
			case 3:
				ODE1RK4(); fStatus=2; break;
			case 4:
				ODE1AB(); fStatus=2; break;
			case 5:
				ODE1System(); fStatus=2; break;
			case 6:				
				ODE2toODE1System(); fStatus=2; break;
			case 7:				
				ODE2FD1(); fStatus=2; break;
			case 8:				
				ODE2FD2(); fStatus=2; break;
		}
	}
	if (fStatus=2)
	{
		ShowTable();			
		InvalidateRect(curve.rc);
	}
}

void CCode10::ODE1System()
{
	
	int i,psi[6];
	double h,psv[6],tmp,max;
	double k1,k2,k3,k4;
	double K1,K2,K3,K4;
	pt[0].x=atof(input[3].item); 
	pt[0].y=atof(input[4].item); 
	pt[0].z=atof(input[5].item);
	h=atof(input[6].item); 
	tmp=atof(input[7].item);
	m=(tmp-pt[0].x)/h; m=((m<M)?m:M);
	max=pt[0].x+(double)m*h;
	tmp=(tmp<max)?tmp:max;
	pt[m].x=tmp;
	psi[1]=23; psi[2]=24; psi[3]=25;
	for (i=0;i<=m;i++)
	{
		psv[1]=pt[i].x;
		psv[2]=pt[i].y;
		psv[3]=pt[i].z;
		k1=h*parse(input[1].item,3,psv,psi); 
		K1=h*parse(input[2].item,3,psv,psi);

		psv[1]=pt[i].x+h/2;
		psv[2]=pt[i].y+k1/2;
		psv[3]=pt[i].z+K1/2;
		k2=h*parse(input[1].item,3,psv,psi); 
		K2=h*parse(input[2].item,3,psv,psi);

		psv[1]=pt[i].x+h/2;
		psv[2]=pt[i].y+k2/2;
		psv[3]=pt[i].z+K2/2;
		k3=h*parse(input[1].item,3,psv,psi); 
		K3=h*parse(input[2].item,3,psv,psi);

		psv[1]=pt[i].x+h;
		psv[2]=pt[i].y+k3;
		psv[3]=pt[i].z+K3;
		k4=h*parse(input[1].item,3,psv,psi); 
		K4=h*parse(input[2].item,3,psv,psi);

		if (i<m)
		{
			pt[i+1].y=pt[i].y+(k1+2*k2+2*k3+k4)/6;
			pt[i+1].z=pt[i].z+(K1+2*K2+2*K3+K4)/6;
			pt[i+1].x=pt[i].x+h;
		}
	}
}

void CCode10::ODE1Taylor()
{
	double psv[6],tmp,max;
	int psi[6];
	int i;
	double h,u,v,w,z;

	pt[0].x=atof(input[2].item); 
	pt[0].y=atof(input[5].item);
	h=atof(input[4].item); 
	tmp=atof(input[3].item); 
	m=(tmp-pt[0].x)/h; m=((m<M)?m:M);
	max=pt[0].x+(double)m*h;
	tmp=(tmp<max)?tmp:max;
	pt[m].x=tmp;
	psi[1]=23; psi[2]=24;
	psi[3]=20; psi[4]=21; //psi[5]=22;
	for (i=0;i<=m;i++)
	{
		psv[1]=pt[i].x; 
		psv[2]=pt[i].y; 
		u=parse(input[1].item,2,psv,psi); 
		psv[3]=u; 
		v=parse(input[6].item,3,psv,psi); 
		psv[4]=v; 
		w=parse(input[7].item,4,psv,psi);
		if (i<m)
		{
			pt[i+1].y=pt[i].y+h*u+pow(h,2)/2*v+pow(h,3)/6*w;
			pt[i+1].x=pt[i].x+h;
		}
	}
}

void CCode10::ODE1AB()
{
	
	int i,psi[6];
	double h,f0,f1,f2,f3,fp,psv[6],tmp,max;
	double k1,k2,k3,k4;
	pt[0].x=atof(input[2].item); pt[0].y=atof(input[5].item);
	h=atof(input[4].item); 
	tmp=atof(input[3].item); 
	m=(tmp-pt[0].x)/h; m=((m<M)?m:M);
	max=pt[0].x+(double)m*h;
	tmp=(tmp<max)?tmp:max;
	pt[m].x=tmp;
	psi[1]=23; psi[2]=24;
	for (i=0;i<=m;i++)
	{
		if (i<3)
		{
			psv[1]=pt[i].x;
			psv[2]=pt[i].y;
			k1=h*parse(input[1].item,2,psv,psi);

			psv[1]=pt[i].x+h/2;
			psv[2]=pt[i].y+k1/2;
			k2=h*parse(input[1].item,2,psv,psi);

			psv[1]=pt[i].x+h/2;
			psv[2]=pt[i].y+k2/2;
			k3=h*parse(input[1].item,2,psv,psi);

			psv[1]=pt[i].x+h;
			psv[2]=pt[i].y+k3;
			k4=h*parse(input[1].item,2,psv,psi);

			pt[i+1].y=pt[i].y+(k1+2*k2+2*k3+k4)/6;
		}
		if (i<m)
		{
			pt[i+1].x=pt[i].x+h;
			if (i>=3)
			{
				psv[1]=pt[i-3].x;
				psv[2]=pt[i-3].y;
				f0=parse(input[1].item,2,psv,psi);

				psv[1]=pt[i-2].x;
				psv[2]=pt[i-2].y;
				f1=parse(input[1].item,2,psv,psi);

				psv[1]=pt[i-1].x;
				psv[2]=pt[i-1].y;
				f2=parse(input[1].item,2,psv,psi);

				psv[1]=pt[i].x; 
				psv[2]=pt[i].y; 
				f3=parse(input[1].item,2,psv,psi);
				pt[i+1].p=pt[i].y+h/24*(-9*f0+37*f1-59*f2+55*f3);

				psv[1]=pt[i+1].x;
				psv[2]=pt[i+1].p;
				fp=parse(input[1].item,2,psv,psi);
				pt[i+1].y=pt[i].y+h/24*(f1-5*f2+19*f3+9*fp);
			}
		}
	}
}

void CCode10::ODE2toODE1System()
{
	
	int i,psi[6];
	double psv[6];
	double h,tmp;
	double k1,k2,k3,k4;
	double K1,K2,K3,K4;
	pt[0].x=atof(input[2].item); 
	pt[0].y=atof(input[3].item); 
	pt[0].z=atof(input[4].item);
	h=atof(input[5].item); 
	tmp=atof(input[6].item); 
	m=(tmp-pt[0].x)/h; m=((m<M)?m:M);
	pt[m].x=tmp;
	psi[1]=23; psi[2]=24; psi[3]=25;
	for (i=0;i<=m;i++)
	{
		psv[1]=pt[i].x;
		psv[2]=pt[i].y;
		psv[3]=pt[i].z;
		k1=h*pt[i].z; K1=h*parse(input[1].item,3,psv,psi);

		psv[1]=pt[i].x+h/2;
		psv[2]=pt[i].y+k1/2;
		psv[3]=pt[i].z+K1/2;
		k2=h*(pt[i].z+K1/2); K2=h*parse(input[1].item,3,psv,psi);

		psv[1]=pt[i].x+h/2; 
		psv[2]=pt[i].y+k2/2;
		psv[3]=pt[i].z+K2/2;
		k3=h*(pt[i].z+K2/2); K3=h*parse(input[1].item,3,psv,psi);

		psv[1]=pt[i].x+h; 
		psv[2]=pt[i].y+k3;
		psv[3]=pt[i].z+K3;
		k4=h*(pt[i].z+K3); K4=h*parse(input[1].item,3,psv,psi);

		if (i<m)
		{
			pt[i+1].y=pt[i].y+(k1+2*k2+2*k3+k4)/6;
			pt[i+1].z=pt[i].z+(K1+2*K2+2*K3+K4)/6;
			pt[i+1].x=pt[i].x+h;
		}
	}
}

void CCode10::ODE2FD1()
{
	
	int i,j,psi[6];
	double psv[6],h,tmp;
	double **a,*b;
	double *p,*q,*r,*w;
	b=new double [M+1];
	p=new double [M+1];
	q=new double [M+1];
	r=new double [M+1];
	w=new double [M+1];
	a=new double *[M+1];
	h=atof(input[5].item);
	m=(int)(atof(input[7].item)-atof(input[6].item))/h; m=((m<M)?m:M);
	pt[0].x=atof(input[6].item); 
	pt[m].x=pt[0].x+(double)m*h;
	pt[0].y=atof(input[8].item); 
	pt[m].y=atof(input[9].item);
	psi[1]=23;
	for (i=1;i<=m-1;i++)
	{
		pt[i].x=pt[i-1].x+h;
		psv[1]=pt[i].x; 
		p[i]=parse(input[1].item,1,psv,psi);
		q[i]=parse(input[2].item,1,psv,psi);
		r[i]=parse(input[3].item,1,psv,psi);
		w[i]=parse(input[4].item,1,psv,psi);
	}
	for (i=0;i<=M;i++)
		a[i]=new double [M+1];
	for (i=1;i<=m-1;i++)
	{
		for (j=1;j<=m-1;j++)
			a[i][j]=0;
		b[i]=0;
	}
	b[1]=w[1]-(p[1]/(h*h)-q[1]/(2*h))*pt[0].y;
	b[m-1]=w[m-1]-(p[m-1]/(h*h)+q[m-1]/(2*h))*pt[m].y;
	for (i=1;i<=m-1;i++)
	{
		a[i][i]=-2*p[i]/(h*h)+r[i];
		if (i<m-1)
			a[i+1][i]=p[i+1]/(h*h)-q[i+1]/(2*h);
		if (i>1)
			a[i-1][i]=p[i-1]/(h*h)+q[i-1]/(2*h);
		if (i>1 && i<m-1)
			b[i]=w[i];
	}
	SolveSLE(a,b);
	for (i=0;i<=M;i++)
		delete a[i];
	delete p,q,r,w,a,b;
}

void CCode10::SolveSLE(double **a,double *b)
{
	int i,j,k,lo,hi;
	double m1,Sum;
	if (fMenu==7)
	{
		lo=1; hi=m-1;
	}
	if (fMenu==8)
	{
		lo=0; hi=m;
	}
	for (k=lo;k<=hi-1;k++)
		for (i=k+1;i<=hi;i++)
		{
			m1=a[i][k]/a[k][k];
			for (j=lo;j<=hi;j++)
				a[i][j] -= m1*a[k][j];
			b[i] -= m1*b[k];
		}
	for (i=hi;i>=lo;i--)
	{
    	Sum=0;
		pt[i].y=0;
		for (j=i;j<=hi;j++)
       		Sum += a[i][j]*pt[j].y;
		pt[i].y=(b[i]-Sum)/a[i][i];
	}
}

void CCode10::ODE2FD2()
{
	
	int i,j,psi[6];
	double psv[6],tmp;
	double h,alpha,beta;
	double **a,*b;
	double *p,*q,*r,*w;
	b=new double [M+1];
	p=new double [M+1];
	q=new double [M+1];
	r=new double [M+1];
	w=new double [M+1];
	a=new double *[M+1];
	for (i=0;i<=M;i++)
		a[i]=new double [M+1];
	h=atof(input[5].item);
	m=(int)(atof(input[7].item)-atof(input[6].item))/h; m=((m<M)?m:M);
	pt[0].x=atof(input[6].item); 
	pt[m].x=pt[0].x+(double)m*h;
	alpha=atof(input[8].item); beta=atof(input[9].item); 
	for (i=0;i<=m;i++)
	{
		if (i<m)
			pt[i+1].x=pt[i].x+h;
		psv[1]=pt[i].x; psi[1]=23;
		p[i]=parse(input[1].item,1,psv,psi);
		q[i]=parse(input[2].item,1,psv,psi);
		r[i]=parse(input[3].item,1,psv,psi);
		w[i]=parse(input[4].item,1,psv,psi);
	}
	for (i=0;i<=m;i++)
	{
		for (j=0;j<=m;j++)
			a[i][j]=0;
		b[i]=0;
	}
	for (i=0;i<=m;i++)
	{
		a[i][i]=-2*p[i]/(h*h)+r[i];
		if (i>0 && i<m)
			a[i][i+1]=p[i]/(h*h)+q[i]/(2*h);
		if (i<m-1)
			a[i+1][i]=p[i+1]/(h*h)-q[i+1]/(2*h);
		if (i>0 && i<m)
			b[i]=w[i];
	}
	a[0][1]=2*p[0]/m;
	a[m][m-1]=2*p[m]/(h*h);
	b[0]=w[0]+(p[0]/(h*h)-q[0]/(2*h))*2*h*alpha;
	b[m]=w[m]-(p[m]/(h*h)+q[m]/(2*h))*2*h*beta;
	SolveSLE(a,b);
	for (i=0;i<=M;i++)
		delete a[i];
	delete p,q,r,w,a,b;
}

void CCode10::Clear(CRect rc)
{
	CClientDC dc(this);
	CBrush whiteBrush(RGB(255,255,255));
	dc.FillRect(&rc,&whiteBrush);
}

⌨️ 快捷键说明

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