Решение системы линейных уравнений методом Холецкого - Turbo Pascal
Формулировка задачи:
Помогите решить написать систему уравнений.
Решение задачи: «Решение системы линейных уравнений методом Холецкого»
textual
Листинг программы
program HOLETSKY; {$M 65520, 65520, 65520} const max_eq = 50; type RealType=double; MCvector = array [0..max_eq] of RealType; {вектор} MCmatr = array [0..max_eq,0..max_eq] of RealType; {запись типа матрица} function maxval(x,y:realtype):realtype; begin if x<y then maxval:=y else maxval:=x; end; procedure Holetskiy(N:integer;A0:MCmatr; B0:MCvector; var X:MCvector; var error:RealType); var i,j,m,k,p :byte; s,e,max :RealType; A :MCmatr; begin if (N>max_eq)or(N<2) then begin writeln('Ошибка в передаваемых данных.'); halt(1); end; A:=A0; for i:=0 to N-1 do A[i,N]:=B0[i]; for i:=0 to N-1 do {выбор главного элемента по диагонали} begin max:=0; for j:=i to N-1 do if max<abs(A[i,j]) then begin max:=abs(A[i,j]); p:=j; end; if p<>i then begin for j:=0 to N do A[N,j]:=A[i,j]; for j:=0 to N do A[i,j]:=A[p,j]; for j:=0 to N do A[p,j]:=A[N,j]; end; end; {метод Холецкого} for j:=1 to N do A[0,j]:=A[0,j]/A[0,0]; for m:=1 to N-1 do begin for i:=m to N-1 do begin s:=0; for k:=0 to m-1 do s:=s+A[i,k]*A[k,m]; A[i,m]:=A[i,m]-s end; for j:=m+1 to N do begin s:=0; for k:=0 to m-1 do s:=s+A[m,k]*A[k,j]; A[m,j]:=(A[m,j]-s)/A[m,m] end; end; X[N-1]:=A[N-1,N]; for i:=N-2 downto 0 do begin s:=0; for k:=i+1 to N-1 do s:=s+A[i,k]*X[k]; X[i]:=A[i,N]-s end; {расчет ошибки} error:=0; for i:=0 to N-1 do begin s:=0; for j:=0 to N-1 do if i=j then s:=s+(A0[i,j]+1)*X[j] else s:=s+A0[i,j]*X[j]; s:=s-B0[i]; error:=maxval(error,abs(X[i]-s)); end; end; var A :MCmatr; B,X :MCvector; err :RealType; n,i,j :integer; begin {of program} writeln('Решение системы линейных уравнений методом Холецкого'); writeln('с выбором главного элемента.'); write('Введите числo уравнений = ');read(N); for i:=0 to N-1 do begin writeln('Введите коэффициенты ',i:0,'-го уравнения:'); for j:=0 to N-1 do begin write('A[',i:0,',',j:0,'] = '); readln(A[i,j]); end; write('B[',i:0,'] = '); readln(B[i]); end; Holetskiy(N,A,B,X,err); writeln('Решение уравнения:'); for i:=0 to N-1 do writeln('X[',i:0,'] = ',X[i]); writeln('Точность результата =',err); end.
Объяснение кода листинга программы
- В программе объявлены переменные: max_eq (максимальное количество уравнений), A0 (матрица входных коэффициентов), B0 (вектор входных переменных), X (вектор выходных переменных), error (переменная для хранения ошибки).
- В функции maxval функция max ищет максимальное значение среди всех элементов массива и возвращает его.
- В процедуре Holetskiy:
- Проверяется, что N не превышает max_eq и не меньше 2. Если условия не выполняются, то выводится сообщение об ошибке и программа завершается.
- Инициализируется переменная A с входными коэффициентами.
- Выполняется перенос всех элементов из массива B в массив A.
- Выполняется метод Холецкого для решения системы уравнений.
- Вычисляется ошибка и записывается в переменную error.
- Выводится решение системы уравнений и точность результата.
- В основной части программы:
- Запрашивается количество уравнений.
- Запрашиваются коэффициенты для каждого уравнения.
- Вызывается процедура Holetskiy с передачей в нее входных данных.
- Выводится решение системы уравнений и точность результата.