📄 code11.cpp
字号:
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 + -