В данной статье будет рассмотрено применение метода конечных разностей для решения стационарных задач. Идея метода конечных разностей заключается в замене производной ее приближенным значением, что выражается через разделенные разности функции в отдельных дискретных точках. Ниже будет представлена программа решения системы линейных алгебраических уравнений с помощью метода Либмана.
Основная идея решения задачи Дирихле базируется на замене частных производных в уравнении Лапласа их конечно-разностным аналогом. Сделав это и использовав представленные выше обозначения, получим такое разностное уравнение для узла (i, j):
где индексы (i, j) принимают значения индексов всех внутренних узлов.
Используя данную формулу мы находим уравнения для каждого неизвестного элемента(внутреннего узла).
Входные данные:
n - количество узлов по вертикали
m - количество узлов по горизонтали
k - расстояние между узлами по вертикали
h - расстояние между узлами по горизонтали
Top, Left, Right и Bottom - соответствующие граничные условия
Код программы:
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>
using namespace std;
void main() {
int n, m, k, h, top, left, right, bottom, H, K;
float sum = 0;
float avg;
double e = 0.0001;
float a[5][5]={0};
float b[5][5]={0};
cout << "Input n: ";
cin >> n;
cout << "Input m: ";
cin >> m;
cout << "Input k: ";
cin >> k;
cout << "Input h: ";
cin >> h;
cout << "\nInput border values:";
cout << "\nTop: ";
cin >> top;
cout << "Left: ";
cin >> left;
cout << "Right: ";
cin >> right;
cout << "Bottom: ";
cin >> bottom;
H = h*h;
K = k*k;
for (int i=0; i<m; i++)
a[0][i] = top;
for (int i=0; i<n; i++)
a[i][0] = left;
for (int i=0; i<n; i++)
a[i][m-1] = right;
for (int i=0; i<m; i++)
a[n-1][i] = bottom;
a[0][0] = a[0][m-1] = a[n-1][0] = a[n-1][m-1] = 0;
for (int i=0; i<m; i++)
sum += a[0][i];
for (int i=0; i<n; i++)
sum += a[i][0];
for (int i=0; i<n; i++)
sum += a[i][m-1];
for (int i=0; i<m; i++)
sum += a[n-1][i];
cout << "\nSum = " << sum << "\n";
avg = sum/((n-2)*2 + (m-2)*2);
cout << "Avg = " << avg << "\n";
for (int i=1; i for (int j=1; j a[i][j] = avg; }
int r, i, j;
for (r=0; r<1000; r++) {
for (i=1; i for (j=1; j a[i][j] = (a[i][j+1]*K + a[i][j-1]*K + a[i+1][j]*H + a[i-1][j]*H)/(2*(H + K));
}
if (r>0) {
if (fabs(a[i-1][j-1]-b[i-1][j-1]) cout << "e: " << e << "\n";
cout << "Number of Iteration: " << r << "\n\n";
r=1000;
}
}
b[i-1][j-1]=a[i-1][j-1];
}
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++)
cout << a[i][j] << "\t";
cout << "\n"; }
system("pause");
}


Комментариев нет:
Отправить комментарий