2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Заполнение матрицы
Сообщение13.09.2020, 13:39 


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

\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

\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 }} =  0,\,\,\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}

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

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

Возникла проблема именно программно, как в $C++$ эту матрицу заполнить циклически? Т.е. у меня каждый элемент матрицы $A[k][m]$ , $k$-номер уравнения, $m$-- номер переменной. С номером уравнения еще ладно, а вот номер переменной $m$ -- как получить этот номер. Сижу уже 2 день, не могу никак сдвинуться. Т.е. вопрос в следующем -- как системе разностных уравнений сопоставить матрицу коэффициентов?

Попробую объяснить простыми словами: вот у меня есть самое верхнее уравнение и для каждых $i,j=2..M-2$. Если расписывать например при фиксированных индексах, получится линейное уравнение относительно $y_0^0, y_1^0...$. Понятно, что некоторые коэффициенты будут равны нулю. Я пытаюсь грубо говоря что сделать -- каждая строка матрицы $А$ -- это каждое уравнение системы. А каждый столбец -- это коэффициент при соответствующей переменной. Так вот я не понимаю, как найти связь между позицией переменной $y_i^j$
и номером столбца, где она должна стоять. Я например, пробую на самом простом случае найти эту закономерность, т.е. если взять $M=2$

Ну вот например, при $i,j = 2$ самое верхнее уравнение будет только одно. Переменная $y_0^0$ -- первая по счету в уравнении, потом $y_0^1 $-- вторая и т.д.


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

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
//Начальные данные для задачи
       

        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);

                        }
                }
        }

 Профиль  
                  
 
 Posted automatically
Сообщение13.09.2020, 14:26 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Программирование» в форум «Карантин»
по следующим причинам:

- отсутствуют собственные содержательные попытки решения задачи;
- не надо набирать обозначения в программе как "недоформулы", воспользуйтесь для этого, например, моноширинным шрифтом.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение13.09.2020, 16:15 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Программирование»


-- 13.09.2020, 16:26 --

Ага, то, что j у вас означало два разных индекса (пробегающих разные диапазоны значений), вы увидели (хотя на коде это не отразилось). :-)

Теперь двинемся дальше. Искомые значения - это величины $y_i^j$, причем оба индекса меняются от $0$ до $M$. Соответственно, надо подобрать какую-то взаимно-однозначную зависимость между $m$ и парой $(i,j)$. Наиболее тривиальный вариант: $m = M\cdot i + j$ или что-то подобное, причем его нельзя подобрать, его можно задать. Поскольку задача более-менее изотропна, сделать какой-то существенно более удачный способ пересчета, пожалуй, не получится, при $M \lesssim 10^2$ это и не очень нужно, а при больших значениях придется возиться с разреженными матрицами.

 Профиль  
                  
 
 Re: Posted automatically
Сообщение13.09.2020, 17:46 


05/09/20
14
Pphantom в сообщении #1483060 писал(а):
 i  Тема перемещена из форума «Карантин» в форум «Программирование»


-- 13.09.2020, 16:26 --

Ага, то, что j у вас означало два разных индекса (пробегающих разные диапазоны значений), вы увидели (хотя на коде это не отразилось). :-)

Теперь двинемся дальше. Искомые значения - это величины $y_i^j$, причем оба индекса меняются от $0$ до $M$. Соответственно, надо подобрать какую-то взаимно-однозначную зависимость между $m$ и парой $(i,j)$. Наиболее тривиальный вариант: $m = M\cdot i + j$ или что-то подобное, причем его нельзя подобрать, его можно задать. Поскольку задача более-менее изотропна, сделать какой-то существенно более удачный способ пересчета, пожалуй, не получится, при $M \lesssim 10^2$ это и не очень нужно, а при больших значениях придется возиться с разреженными матрицами.


Да да, примерно это я и хотел. Я очень долго не мог подобрать эту явную зависимость. Но в итоге вроде получилось это сделать.
Пока пытаюсь сделать на самом примитивном примере, чтобы увидеть закономерность.
Просто хотелось , чтобы какой я не задавал бы $M$, получалась матрица с коэффициентами. Да, может я не самым правильным путем пошел, но это пока единственное, что я придумал.

Правда дальше возникнет еще одна проблема, как мне кажется.. Если самое верхнее уравнение посмотреть, то там уравнений будет $(M-2)^2$. Я в коде, который прикрепил в верхнем сообщении, ввел индекс $k$, который задает номер уравнения. Теперь проблема, а как можно усовершенствовать формулу, чтобы я получил, например в случае $M=5$ четыре строки матрицы и коэффициенты стояли на своих позициях около соотв. переменной. Мне кажется, где то $k$ надо вставить в формулу для $m$, но пока не уверен.

-- 13.09.2020, 17:58 --

Даже специально выписал первые 4 уравнения, которые в самом верху (аппроксимация диффура). Проблема в общем такая -- по системе уравнений получить матрицу с коэффициентами перед переменными...Но система задана, так как я выше писал.

\[
\begin{array}{l}
 i = 2,j = 2\,\,\left( {k = 0} \right) \\ 
 \dfrac{{20}}{{h^4 }}y_2^2  - \dfrac{8}{{h^4 }}\left( {y_3^2  + y_2^3  + y_2^1 } \right) + \dfrac{2}{{h^4 }}\left( {y_3^3  + y_1^3  + y_1^1  + y_3^1 } \right) + \dfrac{1}{{h^4 }}\left( {y_4^2  + y_2^4  + y_0^2  + y_2^0 } \right) = 0 \\ 
 i = 2,\,j = 3\,\,\left( {k = 1} \right): \\ 
 \dfrac{{20}}{{h^4 }}y_2^3  - \dfrac{8}{{h^4 }}\left( {y_3^3  + y_2^4  + y_2^2 } \right) + \dfrac{2}{{h^4 }}\left( {y_3^4  + y_1^4  + y_1^2  + y_3^2 } \right) + \dfrac{1}{{h^4 }}\left( {y_4^3  + y_2^5  + y_0^3  + y_2^1 } \right) = 0 \\ 
 i = 3,j = 2\,\,\left( {k = 2} \right): \\ 
 \dfrac{{20}}{{h^4 }}y_3^2  - \dfrac{8}{{h^4 }}\left( {y_4^2  + y_3^3  + y_3^1 } \right) + \dfrac{2}{{h^4 }}\left( {y_4^3  + y_2^3  + y_2^1  + y_4^1 } \right) + \dfrac{1}{{h^4 }}\left( {y_5^2  + y_3^4  + y_1^2  + y_3^0 } \right) = 0 \\ 
 i = 3,j = 3\,\,\left( {k = 3} \right): \\ 
 \dfrac{{20}}{{h^4 }}y_3^3  - \dfrac{8}{{h^4 }}\left( {y_4^3  + y_3^4  + y_3^2 } \right) + \dfrac{2}{{h^4 }}\left( {y_4^4  + y_2^4  + y_2^2  + y_4^2 } \right) + \dfrac{1}{{h^4 }}\left( {y_5^3  + y_3^5  + y_1^3  + y_3^1 } \right) = 0 \\ 
 \end{array}
\]

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 17:58 
Заслуженный участник


09/05/12
25179
nikitaorel1999 в сообщении #1483079 писал(а):
Правда дальше возникнет еще одна проблема, как мне кажется.. Если самое верхнее уравнение посмотреть, то там уравнений будет $(M-2)^2$.
Граничные условия - это тоже уравнения, и лучше их таким образом и воспринимать, проще будет. Фактически номер уравнения нужен только для того, чтобы писать коэффициенты в нужные ячейки двойного массива, поэтому в явном виде он появляться нигде не должен, его можно просто увеличивать на единицу после "записи" очередного уравнения.

P.S. И не надо цитировать все сразу - выделите нужную часть и нажмите кнопку "Вставка". Цитату в сообщении выше я сам сократил до разумных пределов.

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 18:06 


05/09/20
14
Pphantom в сообщении #1483082 писал(а):
nikitaorel1999 в сообщении #1483079 писал(а):
Правда дальше возникнет еще одна проблема, как мне кажется.. Если самое верхнее уравнение посмотреть, то там уравнений будет $(M-2)^2$.
Граничные условия - это тоже уравнения, и лучше их таким образом и воспринимать, проще будет. Фактически номер уравнения нужен только для того, чтобы писать коэффициенты в нужные ячейки двойного массива, поэтому в явном виде он появляться нигде не должен, его можно просто увеличивать на единицу после "записи" очередного уравнения.

P.S. И не надо цитировать все сразу - выделите нужную часть и нажмите кнопку "Вставка". Цитату в сообщении выше я сам сократил до разумных пределов.


Да, это я понимаю. Я пока пытаюсь реализовать расчеты на маленькой области $\[
\Omega  = \left[ {0,1} \right] \times \left[ {0,1} \right]
\]
$, где шаг $h = 0.25$, т.е. в расчетной области 25 точек. Формально, у меня будет система из 25 уравнений с 25 неизвестными. Как ее решать -- это проблема отдельная. Пока я все-таки пытаюсь эту систему получить (а точнее матрицу системы). Ведь результатом ее решения будет вектор из 25 элементов. А дальше я уже смогу вытащить нужную мне информацию.

P.S: с этой задачей я уже мучаюсь очень много месяцев.. Про численное решение такого диффура мало где вообще написано...
Буквально не так давно осенила идея пойти так, как я сейчас и пытаюсь, мне это показалось проще.. Но и тут как оказалось есть подводный камень в формировании данной матрицы..

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 18:13 
Заслуженный участник


09/05/12
25179
Ну так просто пишите строки, соответствующие уравнениям, по очереди, инкрементируя номер строки. В общем-то алгоритм для этого вы уже даже записали, осталось лишь переписать его на C++.

Ну и последующее решение системы с 25 неизвестными - совсем не проблема, это съест банальный метод Гаусса. Когда (и если) количество точек в области выйдет за $10^3$, можно будет начать подумывать о чем-то еще.

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 18:15 


05/09/20
14
Pphantom в сообщении #1483084 писал(а):
Ну так просто пишите строки, соответствующие уравнениям, по очереди, инкрементируя номер строки. В общем-то алгоритм для этого вы уже даже записали, осталось лишь переписать его на C++.

Ну и последующее решение системы с 25 неизвестными - совсем не проблема, это съест банальный метод Гаусса. Когда (и если) количество точек в области выйдет за $10^3$, можно будет начать подумывать о чем-то еще.


Спасибо Вам за то, что уделили время! Если будут снова затруднения, напишу. Просто я очень обрадовался в пятницу, когда понял, что все таки смогу решить численно свою задачу..

Да, скорее всего может и подойдет обычный Гаусс.. Но преподаватель предлагал и итерационные методы (метод бисопряженных градиентов, Зейдель). Но мне сейчас главное сформировать матрицу системы.

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 18:20 
Заслуженный участник


09/05/12
25179
nikitaorel1999 в сообщении #1483085 писал(а):
Да, скорее всего может и подойдет обычный Гаусс.. Но преподаватель предлагал и итерационные методы.
Для них обычно нужно диагональное преобладание матрицы, а оно "само собой" не возникнет. Так что это путь правильный с точки зрения итогового быстродействия, но более сложный с точки зрения программирования. Поэтому вопрос сводится к тому, каким будет в итоге размер расчетной сетки - до тысяч любой мало-мальски пристойно написанный Гаусс на одном ядре современной персоналки будет работать максимум секунды и нет смысла делать что-то более сложное.

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 18:28 


05/09/20
14
Pphantom в сообщении #1483086 писал(а):
nikitaorel1999 в сообщении #1483085 писал(а):
Да, скорее всего может и подойдет обычный Гаусс.. Но преподаватель предлагал и итерационные методы.
Для них обычно нужно диагональное преобладание матрицы, а оно "само собой" не возникнет. Так что это путь правильный с точки зрения итогового быстродействия, но более сложный с точки зрения программирования. Поэтому вопрос сводится к тому, каким будет в итоге размер расчетной сетки - до тысяч любой мало-мальски пристойно написанный Гаусс на одном ядре современной персоналки будет работать максимум секунды и нет смысла делать что-то более сложное.


Хорошо, еще раз Вам спасибо!

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 22:03 


05/09/20
14
Спустя некоторое время потихоньку матрица начала заполняться необходимыми коэффициентами, правда пока что немного не во всех местах совпадает как при написании системы вручную..
В конце взял и выкинул из программы, где-то вышел за границы массива.

Как и хотел, матрицу стал заполнять по строчкам, при этом уравнения лучше переписать по возрастанию порядка переменных...
Но пока не уверен в правильности своих рассуждений по поводу вычисления положения коэффициента перед соответствующей переменной.

В самых нижних уравнениях оставил циклы по строкам (просто иду по каждому уравнению), но все таки сомневаюсь в правильности вычислений позиций переменных в матрице.

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
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][i + 1 + m * j+1] = 20 / pow(h_x, 4);

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

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

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

                        }
                }

               
        }


        out_of_system(A);



       

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

        int q0 = 1;
        int r0 = 0;

        for (int k = (m - 3) * (n - 3); k < (m - 3) * (n - 3) + m - 2; k++)
        {
                B[k] = -p(X[k], a, selector);          

                for (int i = 2; i < (m - 1); i++)
                {
                        A[k][i + 1 + r0 * q0] = 1 / pow(h_x, 2);
                        A[k][i + 1 - 1 + r0 * q0] = -2 / pow(h_x, 2);
                        A[k][i + 1 - 2 + r0*q0 ] = 1 / pow(h_x, 2);
                       
                }

                r0++;
               
               
        }


        out_of_system(A);
       
        int q1 = 1;
        int r1 = 0;

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

        for (int k = (m - 3) * (n - 3) + m - 2; k < (m - 3) * (n - 3) + m - 2 + m - 1; k++)

        {

               
                        A[k][r1 + 1 + m*0 + r1 * q1] = 1 / pow(h_x, 2);
                        A[k][r1+1 + 1 + m*0 + r1 * q1] = -1 / pow(h_x, 2);
                        A[k][r1 + 1 + m*1 + r1 * q1] = -1 / pow(h_x, 2);
                        A[k][r1 + 1 + 1 + m*1 + r1 * q1] = 1 / pow(h_x, 2);

               
                r1++;

        }

        out_of_system(A);

        int q2 = 1;
        int r2 = 0;




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

        for (int k = (m - 3) * (n - 3) + 2*m - 3 ; k < (m - 3) * (n - 3) + 3*m-5; k++)
        {
               
               
                        A[k][r2-2 + 1 + n*n + r2*q2] = 1 / pow(h_x, 2);
                        A[k][r2-1 + 1 + n*n + r2*q2] = -2 / pow(h_x, 2);
                        A[k][r2 + 1 + n*n + r2*q2] = 1 / pow(h_x, 2);
       

                r2++;

        }

        out_of_system(A);

        int q3 = 1;
        int r3 = 0;



       

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

        for (int k = (m - 3) * (n - 3) + 3 * m - 5; k < (m - 3) * (n - 3) + 4 * m - 5; k++)
        {
                A[k][r3 + 1 + 1 + n*n + r3*q3] = 1 / pow(h_x, 2);
                A[k][r3 + 1 + n*n + r3*q3] = -1 / pow(h_x, 2);
                A[k][r3 + 1+ 1+ (n-1)*(n-1) + r3*q3] = -1 / pow(h_x, 2);
                A[k][r3 +1 + (n-1)*(n-1) + r3*q3] = 1 / pow(h_x, 2);

        }

        out_of_system(A);

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

        int q4 = 1;
        int r4 = 0;

        for (int k = (m - 3) * (n - 3) + 4 * m - 5; k < (m - 3) * (n - 3) + 4 * m - 5 + n-1; k++)
        {

                A[k][0 + (r4+1)*n + r4*q4] = 1 / pow(h_x, 2);
                A[k][0 + r4 * n + r4 * q4] = -2 / pow(h_x, 2);
                A[k][0 + (r4 - 1) * n + r4 * q4] = 1 / pow(h_x, 2);
        }

        int q5 = 1;
        int r5 = 0;

        for (int k = (m - 3) * (n - 3) + 4 * m - 5 + n - 1; k < (m - 3) * (n - 3) + 4 * m - 5 + 2*(n - 1); k++)
        {
                A[k][1 + (r5+1)*n + r5*q5] = 1 / pow(h_x, 2);
                A[k][0 + (r5 + 1) * n + r5 * q5] = -1 / pow(h_x, 2);
                A[k][1 + (r5 + 0) * n + r5 * q5] = -1 / pow(h_x, 2);
                A[k][0 + (r5 + 0) * n + r5 * q5] = 1 / pow(h_x, 2);
        }

        int q6 = 1;
        int r6 = 0;


        for (int k = (m - 3) * (n - 3) + 4 * m - 5 + 2 * (n - 1); k < (m - 3) * (n - 3) + 4 * m - 5 + 3 * (n - 1); k++)
        {
                A[k][m + (r6 + 1) * n + r6 * q6] = 1 / pow(h_x, 2);
                A[k][m + r6 * n + r6 * q6] = -2 / pow(h_x, 2);
                A[k][m + (r6 - 1) * n + r6 * q6] = 1 / pow(h_x, 2);
        }

        int q7 = 1;
        int r7 = 0;

        for (int k = (m - 3) * (n - 3) + 4 * m - 5 + 3 * (n - 1); k < (m - 3) * (n - 3) + 4 * m - 5 + 4 * (n - 1); k++)
        {
                A[k][m + (r7 + 1) * n + r7 * q7] = 1 / pow(h_x, 2);
                A[k][m-1 + (r7 + 1) * n + r7 * q7] = -1 / pow(h_x, 2);
                A[k][m + (r7 + 0) * n + r7 * q7] = -1 / pow(h_x, 2);
                A[k][m-1 + (r7 + 0) * n + r7 * q7] = 1 / pow(h_x, 2);
        }

       

        out_of_system(A);

        out_of_right_vector(B);



P.S: хотел вставить изображение своей матрицы, но не получилось :(

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 22:09 
Заслуженный участник
Аватара пользователя


22/06/12
2129
/dev/zero
nikitaorel1999 в сообщении #1483123 писал(а):
P.S: хотел вставить изображение своей матрицы, но не получилось :(

imgur, ссылку сюда в тег img

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение13.09.2020, 22:59 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
nikitaorel1999 в сообщении #1483123 писал(а):
P.S: хотел вставить изображение своей матрицы, но не получилось :(
"Как вставлять картинки" (эту ссылку можно увидеть слева от поля ввода сообщения).

 Профиль  
                  
 
 Re: Заполнение матрицы
Сообщение16.09.2020, 22:32 


05/09/20
14
И снова здравствуйте! В итоге удалось решить проблему , правда без использования С++, а с использованием компьютерной алгебры Wolfram Mathematica. Смог просто записать полностью свою систему уравнений символьно и вытащить из каждого уравнения коэффициенты и таким образом сформировать матрицу.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Mikhail_K


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group