Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.166.170.195] |
|
Сообщ.
#1
,
|
|
|
Есть система уравнений, например:
3Х1+4Х2-2Х3=4 -Х1-Х2+3Х3=6 Х1-7Х2+Х3=-2 Необходимо решить 2я методами (Зейделя и Гаусса). Желательно алгоритм, или текст программы (лучше 2е ) Заранее благодарен! |
Сообщ.
#2
,
|
|
|
faq you!!
могу дать собственноручно написанного гаусса на тмт паскале с асмеблерными вставками |
Сообщ.
#3
,
|
|
|
Пуляй, авось пойму что
А что насчет Зейделя? |
Сообщ.
#4
,
|
|||
|
яж тебе сказал, смотри фак! там зейдель был, правда без комментариев да и про гаусса там есь что такое зейдель я сам до сих пор не знаю. ищо смотри на http://algolist.manual.ru/ гаусс
спрашивай чо не поймёшь |
Сообщ.
#5
,
|
|
|
Пока большое спасибо, буду разбираться
|
Сообщ.
#6
,
|
|
|
В курсовой по электротехнике и технологиям программирования попался вариант, где решение системы уравнений(для определения токов в 6 ветвях цепи) решается методом Гаусса. Я это дело закодил, проверил, но не учел того что система (составленная по первому и второму законам Кирхгофа) в первых 3 уравнениях имеет много нулей.. Из-за этого метод вылетает с ошибкой.
Первые 3 строки из матрицы коэффициентов: 1)1 -1 0 0 -1 0 2)-1 0 -1 1 0 0 3)0 0 0 -1 1 1 Стопорится всегда вот здесь(деление на нуль, при i=3, то есть LowMatrix[3,3]=0 ) : UpMatrix[i,j]:=(Matrix[i,j]-TempSum2)/LowMatrix[i,i]; Буду очень признателен человеку, который поможет усовершенствовать алгоритм и дописать в него выбор максимального элемента по столбцу. unit Gauss; interface type Matrix_6x6= array[1..6] of array[1..6] of real; //Матрица 6x6 VectorStolbec6= array[1..6] of real; //Вектор-столбец свободных членов function GaussMethod(Matrix:Matrix_6x6; Vector:VectorStolbec6):VectorStolbec6; implementation function GaussMethod(Matrix:Matrix_6x6; Vector:VectorStolbec6):VectorStolbec6; var LowMatrix:Matrix_6x6; UpMatrix:Matrix_6x6; i,j,k,l:integer; TempSum,TempSum2:real; Y, X:VectorStolbec6; //Векторы Y, X для решения 2 систем уравнений begin {!-------------Часть 1. Разложение A=LU-------------!} //Обнуление матриц и векторов for i:=1 to 6 do for j:=1 to 6 do begin UpMatrix[i,j]:=0; LowMatrix[i, j]:=0; Y[i]:=0; X[i]:=0; end; //Самые примитивные вычисления for i:=1 to 6 do LowMatrix[i, 1]:=Matrix[i, 1]; // for i:=2 to 6 do UpMatrix[1, i]:=Matrix[1, i]/LowMatrix[1,1]; for i:=1 to 6 do UpMatrix[i,i]:=1; //Начало разложения: TempSum:=0; TempSum2:=0; for i:=2 to 6 do for j:=2 to 6 do begin //Верхняя треугольная матрица U if (j>i) and (j>1) then begin TempSum2:=0; for l:=1 to i-1 do TempSum2:=TempSum2+LowMatrix[i,l]*UpMatrix[l,j]; Form1.Caption:=inttostr(i); UpMatrix[i,j]:=(Matrix[i,j]-TempSum2)/LowMatrix[i,i]; end; //Нижняя треугольная матрица L if (j>1) and (j<=i) then begin TempSum:=0; for k:=1 to j-1 do TempSum:=TempSum+LowMatrix[i,k]*UpMatrix[k, j]; LowMatrix[i,j]:=Matrix[i,j]-TempSum; end; // end; {!-------------Конец разложения-------------!} {!-------------Часть 2. Нахождение корней--------!} //Сначала решаем систему Ly=b и находим вектор Y TempSum:=0; for i:=1 to 6 do begin if i>=1 then begin TempSum:=0; for k:=1 to i do TempSum:=TempSum+LowMatrix[i, k]*Y[k]; Y[i]:=(Vector[i]-TempSum)/LowMatrix[i,i]; end; end; {Нужно было для отладки Form1.Memo1.Lines.Add('Y1: '+floattostr(Y[1])); Form1.Memo1.Lines.Add('Y2: '+floattostr(Y[2])); Form1.Memo1.Lines.Add('Y3: '+floattostr(Y[3])); //----конец } //После нахождения вектора Y переходим к нахождению вектора X //Его находим из системы Ux=y TempSum:=0; for i:=6 downto 1 do//Так как ход обратный begin TempSum:=0; for k:=i+1 to 6 do begin TempSum:=TempSum+UpMatrix[i,k]*X[k]; end; X[i]:=Y[i]-TempSum; end; {!-------------Конец. Корни найдены, возвращаем результат в виде вектора--------!} Result:=X; end; end. |
Сообщ.
#7
,
|
|
|
VeRmuTT, если ты о задаче избавления от нулей на главной диагонали матрицы - то вот тут было кое-что:
Возвращаемся к матрицам и определителям (сообщение #1043423) |
Сообщ.
#8
,
|
|
|
Да, но там стоит задача найти определитель, а в моем случае по-моему никак нельзя делать то что там описано в процедуре diagonal... Скорее всего, у меня не получится решить мою систему методом LU разложения... Вот нашел отличный алгоритм(с выбором максимального элемента, там с нулями нет проблемы), но он на Си, а в Паскаль не могу перевести(корни не те выдает). Если кто возмётся помочь-дам код
|
Сообщ.
#9
,
|
|
|
Ну, запость его в разделе Паскаль - поможем перевести...
|