用有限元方法解二维的拉普拉斯方程,求出有边缘二维面上的电势分布
这里以计算10x10区域为演示,当差异小于设置值后停止演算
Code:
#include <QCoreApplication>
#include "math.h"
void Matrix_Init();
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Matrix_Init();
return a.exec();
}
void Matrix_Init()
{
int xMax = 10;
int yMax = 10;
double maxt = 1;
double t = 0;
int i = 0,j = 0;
int k = 0;
double MatrixOrigin[10][10],MatrixNext[10][10];
printf("Current matrix start parameter:\r\n X MAX: %d Y MAX: %d\r\n",xMax,yMax );
for (i = 0;i < yMax;i += 1)//Init Matrix
{
for (j = 0;j < xMax;j += 1)
{
MatrixNext[i][j] = 0;
MatrixOrigin[i][j] = 0;
}
}
for (i = 1;i < xMax-1;i += 1)//Set 100V area
{
MatrixOrigin[0][i] = 100;
MatrixNext[0][i] = 100;
}
for (i = 0;i < yMax;i += 1)
{
for (j = 0;j < xMax;j += 1)
{
printf("%.0f ", MatrixNext[i][j]);
}
printf("\r\n");
}
k = 0;
while (maxt > 0.00001)
{
k += 1;
maxt = 0;
for (i = 1;i < yMax-1;i += 1)
{
for (j = 1;j < xMax-1;j += 1)
{
MatrixNext[i][j] = (MatrixOrigin[i][j + 1] + MatrixOrigin[i][j - 1] + MatrixOrigin[i + 1][j] + MatrixOrigin[i - 1][j]) / 4;
t = fabs(MatrixNext[i][j] - MatrixOrigin[i][j]);
if (t > maxt)
{
maxt = t;
}
}
}
printf("\r\n--------------%d----------------\r\n",k);
for (i = 0;i < yMax;i += 1)//Init Matrix
{
for (j = 0;j < xMax;j += 1)
{
printf("%.6f ", MatrixNext[i][j]);
MatrixOrigin[i][j] = MatrixNext[i][j];
}
printf("\r\n");
}
}
printf("\r\n Count over.Final convergency value:%f \r\n",maxt);
return;
}