Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2020, 22:13   #1
nikitaorel
Новичок
Джуниор
 
Регистрация: 15.09.2020
Сообщений: 1
По умолчанию Заполнение матрицы

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

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

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

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

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

Код:
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][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 = 2;

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

				
			A[k][r0 + 1 +  q0] = 1 / pow(h_x, 2);
			A[k][r0 + 1 - 1 +  q0] = -2 / pow(h_x, 2);
			A[k][r0 + 1 - 2 + q0 ] = 1 / pow(h_x, 2);
			
		
		r0++;
		
		
	}


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

	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 = 2;




	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);
	}
Попробую объяснить простыми словами: вот у меня есть самое верхнее уравнение и для каждых 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 – вторая и т.д (файл матрица 2.jpg)
Изображения
Тип файла: jpg Матрица.jpg (45.9 Кб, 1 просмотров)
Тип файла: jpg Матрица2.JPG (42.0 Кб, 1 просмотров)
nikitaorel вне форума Ответить с цитированием
Старый 16.09.2020, 03:34   #2
сфинкс
Форумчанин
 
Аватар для сфинкс
 
Регистрация: 17.06.2012
Сообщений: 954
По умолчанию

Матрица = Таблица
Но на картинках нет таблиц

Циклы с непонятными параметрами
Думаю нужны комментарии в строки циклов

Возможно все поняли бы программу на языке проще
Случайные и Массивы https://programmersforum.ru/showthread.php?t=344371 Учим C# & basic & excel & python https://programmersforum.ru/showthre...=327446&page=5 ничего нерекомендую
сфинкс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение матрицы ClawsOfTornarus Общие вопросы Delphi 3 20.12.2017 01:37
Заполнение матрицы AnZet Паскаль, Turbo Pascal, PascalABC.NET 9 04.12.2011 14:48
Заполнение матрицы С++ Перфаратар Помощь студентам 7 20.10.2010 19:20
Заполнение матрицы -=aHTPoПоС=- Помощь студентам 3 06.11.2009 17:33
Заполнение матрицы Pedro Помощь студентам 3 22.04.2009 23:53