Математический форум Math Help Planet
http://mathhelpplanet.com/

Заполнение матрицы
http://mathhelpplanet.com/viewtopic.php?f=44&t=71111
Страница 1 из 1

Автор:  orelna [ 13 сен 2020, 12:22 ]
Заголовок сообщения:  Заполнение матрицы

Добрый день! Решаю численно задачу (дифференциальное уравнение в частных производных 4 порядка - бигармоническое уравнение).
Для решения использую следующую разностную схему:

[math]\dfrac{{20}}{{h^4 }}y_i^j - \dfrac{8}{{h^4 }}\left( {y_{i + 1}^j + y_i^{j + 1} + y_i^{j - 1} } \right) + \dfrac{2}{{h^4 }}\left( {y_{i + 1}^{j + 1} + y_{i - 1}^{j + 1} + y_{i - 1}^{j - 1} + y_{i + 1}^{j - 1} } \right) + \dfrac{1}{{h^4 }}\left( {y_{i + 2}^j + y_i^{j + 2} + y_{i - 2}^j + y_{i - 2}^j } \right) = 0 , i,j = 2.. M-2[/math]

[math]\begin{array}{l}
\dfrac{{y_i^0 - 2y_{i - 1}^0 + y_{i - 2}^0 }}{{h^2 }} = - p\left( {x_i } \right),\,\,i = \overline {2,M - 1} , \\
\dfrac{{y_{i + 1}^1 - y_i^1 - y_{i + 1}^0 + y_i^0 }}{{h^2 }} = - q\left( {x_i } \right),\,\,\overline {i = 1,M - 1} . \\
\dfrac{{y_i^N - 2y_{i - 1}^N + y_{i - 2}^N }}{{h^2 }} = 0,\,\,\dfrac{{y_{i + 1}^N - y_i^N - y_{i + 1}^{N - 1} + y_i^{N - 1} }}{{h^2 }} = 0,\,\,i = \overline {2,M } , \\
\dfrac{{y_0^{j + 1} - 2y_0^j + y_0^{j - 1} }}{{h^2 }} = 0,\,\,\dfrac{{y_1^{j + 1} - y_0^{j + 1} - y_1^j + y_0^j }}{{h^2 }} = 0,\,\,j = \overline {0,M - 1} , \\
\dfrac{{y_M^{j + 1} - 2y_M^j + y_M^{j - 1} }}{{h^2 }} = 0,\,\,\dfrac{{y_M^{j + 1} - y_{M - 1}^{j + 1} - y_M^j + y_{M - 1}^j }}{{h^2 }} = 0,\,\,j = \overline {1,M - 1} . \\
\end{array}[/math]


Пытаюсь заполнить матрицу системы размером [math](M+1)^2[/math], где каждая строка -- это соответствующее уравнение, а столбцы -- это коэффициенты перед переменными..

Т.е. каждая строка матрицы -- уравнение с переменными [math]y_{0}^{0}, y_1^0 , y_2^0[/math] и т.д.

Возникла проблема именно программно, как в С++ эту матрицу заполнить циклически? Т.е. у меня каждый элемент матрицы [math]A[i][j][/math] , [math]i[/math]-номер уравнения, [math]j[/math]-- номер переменной. С номером уравнения еще ладно, а вот номер переменной [math]j[/math] -- как получить этот номер. Сижу уже 2 день, не могу никак сдвинуться.

Автор:  orelna [ 13 сен 2020, 15:27 ]
Заголовок сообщения:  Re: Заполнение матрицы

Внизу прилагаю код того, как хотя бы я пытался заполнить матрицу коэффициентов системы для первого уравнения. Я просто не могу выявить закономерность между переменной y[i][j] и номером столбца, в которой она стоит.

//Начальные данные для задачи


TIP T, h_x, h_z, M, N, a, b;


cout << "Введите a = ";
cin >> a;
cout << "Введите b = ";
cin >> b;
cout << "Введите шаг по x-координате h_x =";
cin >> h_x;
cout << "Введите шаг по x-координате h_z =";
cin >> h_z;




int m = a / h_x ; // количество точек сетки по пространству
int n = b / h_z ; // количество точек сетки по времени

cout << "m = " << n << endl;
cout << "n = " << m << endl;


Matrix A((n+1)*(m+1), vector <TIP>((n + 1) * (m + 1))); // матрица системы

for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
A[i][j] = 0.0;
}
}


Menu(); //вызов меню пользователя для выбора решаемой задачи
int selector;
cin >> selector;



vec X(n+1); // сетка по X
vec Z(m+1); // сетка по Z

vec B((m+1) * (n+1));

for (int i = 0; i <= n * m; i++)
{
B[i] = 0;
}


for (int i = 0; i <= m; i++)
{
X[i] = i * h_x;
}

for (int j = 0; j <= n; j++)
{
Z[j] = j * h_z;
}

cout << "Сетка по X:" << endl;
out_of_right_vector(X);
cout << endl;

cout << "Сетка по Z:" << endl;
out_of_right_vector(Z);
cout << endl;

cout << "Формирование матрицы системы - 1 этап" << endl;



for (int k = 0; k < (m - 3) * (n - 3) ; k++)
{
for (int i = 2; i <= (m - 2); i++)
{
for (int j = 2; j <= (n - 2); j++)
{
A[k][j + i ] = 20 / pow(h_x, 4);

A[k][j + i + 1 ] = -8 / pow(h_x, 4);
A[k][j + 1 + i ] = -8 / pow(h_x, 4);
A[k][j - 1 + i] = -8 / pow(h_x, 4);

A[k][i + 1 + j + 1 ] = 2 / pow(h_x, 4);
A[k][j + 1 + i -1 ] = 2 / pow(h_x, 4);
A[k][j - 1 + i - 1 ] = 2 / pow(h_x, 4);
A[k][j - 1 + i + 1 ] = 2 / pow(h_x, 4);

A[k][j + i + 2 ] = 1 / pow(h_x, 4);
A[k][j + 2 + i ] = 1 / pow(h_x, 4);
A[k][j + i - 2 ] = 1 / pow(h_x, 4);
A[k][j - 2 + i ] = 1 / pow(h_x, 4);

}
}
}

Автор:  Emphatic18 [ 23 сен 2020, 14:49 ]
Заголовок сообщения:  Re: Заполнение матрицы

Что то Вы по моему перемудрили. Я например не понимаю для чего 3 вложенных цикла у Вас (если правильно понял что Вы хотите). Матрица квадратная, нужен 1 внешний цикл и один вложенный. И кроме того Вы ведь записываете в файл не переменные Y0...Yn, а пишите коэффициенты при Y. Не знаю как Вы хотите решать, но обычно просто записываются уравнения, в котором Y это элементы массива.
dy(1) = a1*y(1) + b1*y(2)...
dy(2) = a2*y(1) + b2*y(2)...

Правда с задачами в частных производных заниматься не приходилось, может быть там есть свои особенности.

Страница 1 из 1 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/