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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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