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

📄 code11.cpp

📁 Partial differential equations
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					CRect(CPoint(hGrid.x+(n+1)*hSpace-10,hGrid.y+m/2*vSpace),
					CSize(90,25)),this,idc++);
			input[nInputItems+3].ed.DestroyWindow();
			input[nInputItems+4].ed.DestroyWindow();
			input[nInputItems+3].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+40,hGrid.y+(m+1)*vSpace-10),
					CSize(90,25)),this,idc++);
			input[nInputItems+4].ed.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, 
					CRect(CPoint(hGrid.x+240,hGrid.y+(m+1)*vSpace-10),
					CSize(90,25)),this,idc++);
			fStatus=2;
		}
	}
	rc=CRect(CPoint(hGrid.x+(n+1)*hSpace-10,hGrid.y+(m+1)*vSpace-10),CSize(100,25));
	InvalidateRect(rcGrid);
}

void CCode11::ShowTable()
{
	CString str;
	CPoint hTable;
	CRect rcTable;
	int sA,i,j;
	if (fMenu==1)
		sA=(m-1)*(n-1);
	if (fMenu==2)
		sA=m*(n-1);
	hTable=CPoint(200,20);
	rcTable=CRect(hTable.x,hTable.y,hTable.x+550,hTable.y+220);
	table1.DestroyWindow();
    table1.Create(WS_VISIBLE | WS_CHILD | WS_DLGFRAME | LVS_REPORT
        | LVS_NOSORTHEADER,rcTable,this,idc++);
	hTable=CPoint(770,20);
	rcTable=CRect(hTable.x,hTable.y,hTable.x+100,hTable.y+220);
	table2.DestroyWindow();
    table2.Create(WS_VISIBLE | WS_CHILD | WS_DLGFRAME | LVS_REPORT
        | LVS_NOSORTHEADER,rcTable,this,idc++);
	for (int i=1;i<=sA;i++)
		table1.InsertColumn(i-1,((i==1)?"A":""),LVCFMT_CENTER,80);
    table2.InsertColumn(0,"b",LVCFMT_CENTER,80);
	for (i=1;i<=sA;i++)
	{
		str.Format("%lf",a[1][i]); 
		table1.InsertItem(i-1,str,0);
		str.Format("%lf",b[i]); 
		table2.InsertItem(i-1,str,0);
		for (int j=1;j<=sA;j++)
		{
			str.Format("%lf",a[i][j]); 
			table1.SetItemText(i-1,j-1,str);
		}
	}
}

void CCode11::Poisson()
{
	int i,j,r,sA;
	int psi[4];
	double psv[4];
	SecondInput();
	pt[1].y=pt[0].y+k;
	for (j=1;j<=m-1;j++)
	{
		psi[1]=24; psv[1]=pt[j].y;
		u[0][j]=parse(input[nInputItems+1].item,1,psv,psi);
		u[n][j]=parse(input[nInputItems+2].item,1,psv,psi);
		pt[j+1].y=pt[j].y+k;
	}
	for (i=0;i<=n;i++)
	{
		psi[1]=23; psv[1]=pt[i].x;
		u[i][0]=parse(input[nInputItems+3].item,1,psv,psi);
		u[i][m]=parse(input[nInputItems+4].item,1,psv,psi);
		if (i<n)
			pt[i+1].x=pt[i].x+h;
	}
	for (j=0;j<=m;j++)
		for (i=0;i<=n;i++)
		{
			psi[1]=23; psv[1]=pt[i].x;
			psi[2]=24; psv[2]=pt[j].y;
			w[i][j]=parse(input[1].item,2,psv,psi);
		}
				
	// form the SLE
	sA=(m-1)*(n-1);
	for (i=1;i<=sA;i++)
	{
		b[i]=0;
		for (j=1;j<=sA;j++)
			a[i][j]=0;
	}
	for (r=1;r<=sA;r++)
	{
		a[r][r]=-2*(h*h+k*k);
		if (r<=2*(n-1))
		{
			a[r][n-1+r]=h*h;
			a[n-1+r][r]=h*h;
		}
		a[1][2]=k*k; a[2][1]=k*k;
		if (r%(n-1)!=0 && r<(m-1)*(n-1))
		{
			a[r][r+1]=k*k;
			a[r+1][r]=k*k;
		}
	}
	for (j=1;j<=m-1;j++)
		for (i=1;i<=n-1;i++)
		{
			// compute b[r]
			r=i+(j-1)*(n-1);
			b[r]=h*h*k*k*w[i][j];
			if (j==1)
			{
				b[r] -= h*h*u[i][0];
				if (i==1)
					b[r] -= k*k*u[0][1];
				if (i==n-1)
					b[r] -= k*k*u[n][1];
			}
			if (j>1 && j<m-1)
			{
				if (i==1)
					b[r] -= k*k*u[0][j];
				if (i==n-1)
					b[r] -= k*k*u[n][j];
			}
			if (j==m-1)
			{
				b[r] -= h*h*u[i][m];
				if (i==1)
					b[r] -= k*k*u[0][m-1];
				if (i==n-1)
					b[r] -= k*k*u[n][m-1];
			}
		}
	fStatus=3;
	Clear(input[0].rc);
	ShowTable();
	SolveSLE();
	InvalidateRect(rcGrid);
	InvalidateRect(input[0].display);
}

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

void CCode11::SolveSLE()
{
	int i,j,r,sA;
	double m1,Sum;

	if (fMenu==1)
		sA=(m-1)*(n-1);
	if (fMenu==2)
		sA=m*(n-1);

	// solve the SLE
	for (r=1;r<=sA-1;r++)
		for (i=r+1;i<=sA;i++)
		{
			m1=a[i][r]/a[r][r];
			for (j=1;j<=sA;j++)
				a[i][j] -= m1*a[r][j];
			b[i] -= m1*b[r];
		}
	for (r=sA;r>=1;r--)
	{
    	Sum=0;
		z[r]=0;
		for (j=r;j<=sA;j++)
       		Sum += a[r][j]*z[j];
		z[r]=(b[r]-Sum)/a[r][r];
	}
	for (j=1;j<=m;j++)
		for (i=1;i<=n-1;i++)
		{
			r=i+(j-1)*(n-1);
			if (fMenu==2)
				u[i][j]=z[r];
			if (fMenu==1 && j<=m-1)
				u[i][j]=z[r];
		}
}

void CCode11::Heat()
{
	int i,j,r,sA;
	int psi[4];
	double psv[4];
	SecondInput();
	alpha=atof(input[1].item);
	pt[1].t=pt[0].t+k;
	for (j=1;j<=m;j++)
	{
		psi[1]=19; psv[1]=pt[j].t;
		u[0][j]=parse(input[nInputItems+1].item,1,psv,psi);
		u[n][j]=parse(input[nInputItems+2].item,1,psv,psi);
		if (j<m)
			pt[j+1].t=pt[j].t+k;
	}
	for (i=0;i<=n;i++)
	{
		psi[1]=23; psv[1]=pt[i].x;
		u[i][0]=parse(input[nInputItems+3].item,1,psv,psi);
		if (i<n)
			pt[i+1].x=pt[i].x+h;
	}
	
	sA=m*(n-1);
	for (i=1;i<=sA;i++)
	{
		b[i]=0;
		for (j=1;j<=sA;j++)
			a[i][j]=0;
	}			
	for (j=0;j<=m-1;j++)
		for (i=1;i<=n-1;i++)
		{
			r=i+j*(n-1);
			// compute A
			a[r][r]=2*(h*h+alpha*alpha*k);
			if (r%(n-1)!=0 && r<m*(n-1))
			{
				a[r][r+1]=-alpha*alpha*k;
				a[r+1][r]=a[r][r+1];
			}
			if (r<=2*(n-1)+1)
				if (r%(n-1)!=1)
					a[n+r-2][r]=-alpha*alpha*k;
			if (r<=2*(n-1))
				a[n-1+r][r]=2*(-h*h+alpha*alpha*k);
			if (r<=2*(n-1)-1)
				if (r%(n-1)!=0)
					a[n+r][r]=-alpha*alpha*k;
				
			// compute b[r]
			if (j==0)
			{
				b[r]=pow(alpha,2)*k*u[i-1][0]-2*u[i][0]*(-pow(h,2)+k*pow(alpha,2))
					+pow(alpha,2)*k*u[i+1][0];
				if (i==1)
					b[r] += pow(alpha,2)*k*u[0][1];
				if (i==n-1)
					b[r] += pow(alpha,2)*k*u[n][1];
			}
			if (j>0)
			{
				if (i==1)
					b[r]=pow(alpha,2)*k*(u[0][j]+u[0][j+1]);
				if (i==n-1)
					b[r]=pow(alpha,2)*k*(u[n][j]+u[n][j+1]);
			}
		}
	fStatus=3;
	Clear(input[0].rc);
	ShowTable();
	SolveSLE();
	InvalidateRect(rcGrid);
	InvalidateRect(input[0].display);
}

void CCode11::Wave()
{
	int i,j,r,sA;
	int psi[2];
	double psv[2];
	double uD[N+1];
	SecondInput();
	alpha=atof(input[1].item);
	pt[1].t=pt[0].t+k; 
	psi[1]=19; 
	for (j=1;j<=m;j++)
	{
		psv[1]=pt[j].t;
		u[0][j]=parse(input[nInputItems+1].item,1,psv,psi);
		u[n][j]=parse(input[nInputItems+2].item,1,psv,psi);
		if (j<m)
			pt[j+1].t=pt[j].t+k;
	}
	psi[1]=23;
	for (i=0;i<=n;i++)
	{
		psv[1]=pt[i].x;
		u[i][0]=parse(input[nInputItems+3].item,1,psv,psi);
		uD[i]=parse(input[nInputItems+4].item,1,psv,psi);
		if (i<n)
			pt[i+1].x=pt[i].x+h;
	}
	for (i=1;i<=n-1;i++)
		u[i][1]=1/(2*pow(h,2))
				*(2*pow(h,2)*k*uD[i]+pow(k,2)*pow(alpha,2)*u[i-1][0]
				-(-2*pow(h,2)+2*pow(k,2)*pow(alpha,2))*u[i][0]
				+pow(k,2)*pow(alpha,2)*u[i+1][0]);
	for (j=1;j<=m-1;j++)
		for (i=1;i<=n-1;i++)
			u[i][j+1]=1/pow(h,2)*(-pow(h,2)*u[i][j-1]
					+pow(k,2)*pow(alpha,2)*u[i-1][j]
					-(-2*pow(h,2)+2*pow(k,2)*pow(alpha,2))*u[i][j]
					+pow(k,2)*pow(alpha,2)*u[i+1][j]);
	fStatus=3;
	InvalidateRect(rcGrid);
	InvalidateRect(input[0].display);
}

void CCode11::SecondInput()
{
	for (int i=1;i<=4;i++)
		if (fMenu!=2 || (fMenu==2 && i<4))
			input[nInputItems+i].ed.GetWindowText(input[nInputItems+i].item);
}

⌨️ 快捷键说明

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