Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
123.docx
Скачиваний:
9
Добавлен:
28.03.2015
Размер:
125.45 Кб
Скачать

Метод Зейделя

Метод Зейделя представляет собой некоторую модификацию метода итерации. Основная его идея заключается в том, что при вычислении (k+1)-го приближения неизвестной хi учитываются уже вычисленные ранее (k+1)-е приближения неизвестных х1, x2, ...,xi-1.

Пусть дана приведенная линейная система

(i=1,2,….,n).

Выберем произвольно начальные приближения корней

стараясь, конечно, чтобы они в какой-то мере соответствовали искомым неизвестным

x1, x2, …. , xn

Далее, предполагая, что k-е приближения хi(k) корней известны, согласно Зейделю будем строить (k+1)-е приближения корней по следующим формулам:

k=(0,1,2…).

Процесс Зейделя может сходиться даже в том случае, если расходится процесс итерации. Однако это бывает не всегда. Возможны случаи, когда процесс Зейделя сходится медленнее процесса итерации. Более того, могут быть случаи, когда процесс итерации сходится, а процесс Зейделя расходится.

Fortran

Метод Крамера

1

2-5

6

9 72

dimension a(4,5), res(4), matrix(4,4)

real det, modDet, startDet

integer counter

do i=1,4

write(*,*)"Input string ",i

do j=1,5

write(*,*)" Input element ",j

read(*,*)a(i,j)

enddo

enddo

det=startDet(matrix, a);

if(det.EQ.0.0)then

write(*,*)'Error: null det'

goto 1

end if

do m=1,4

res(m)=modDet(matrix, a, m)/det

enddo

do i=1,4

write(*,*)res(i)

enddo

1 end

subroutine det_(matrix, handle)

real tmp, summ, matrix(4,4), handle

integer counter

counter=0

do i=1,3

if(matrix(i,i).EQ.0.0) then

do j=i+1,4

if(matrix(j,i).NE.0.0) then

do k=1,5

tmp=matrix(i,k)

matrix(i,k)=matrix(j,k)

matrix(j,k)=tmp

counter=counter+1

enddo

end if

enddo

end if

do j=i+1,4

factor=-(matrix(j,i)/matrix(i,i))

do k=1,5

matrix(j,k)=matrix(j,k)+matrix(i,k)*factor

enddo

enddo

enddo

summ=matrix(1,1)

do i=2,4

summ=summ*matrix(i,i)

enddo

handle=-1**counter*summ

end subroutine det_

function startDet(matrix, a)

real matrix(4,4), a(4,5), startDet

do i=1,4

do j=1,4

matrix(i,j)=a(i,j);

enddo

enddo

call det_(matrix, startDet)

end function startDet

function modDet(matrix, a, num)

real a(4,5), matrix(4,4), modDet

integer num

do i=1,4

do j=1,4

if(j.NE.num)then

matrix(i,j)=a(i,j)

else

matrix(i,j)=a(i,n)

end if

enddo

enddo

call det_(matrix, modDet)

end function modDet

Метод Гаусса

1

2-5

6

9 72

program gauss

real temp, e

integer i, j, k, N

real, allocatable :: matrix(:,:), x(:)

print*, "Enter the the number of x="

read*, N

allocate (matrix(N,N))

allocate (x(N))

print*, "Enter the coefficients"

do i=1, N

do j=1, N+1

print*, "A[",i,"][",j,"]"

read*, matrix(i,j)

enddo

enddo

do i=1,N

if(matrix(i,i)==0) then

print*,'input error (matrix(i,i)=0)'

stop

endif

enddo

do i = 1,N

write(*,*) (matrix(i,j), j=1,N+1)

end do

!прямой ход

do i = 1,N

do j = i+1,N

temp = (matrix(j,i))/(matrix(i,i))

do k = 1,N+1

matrix(j,k)=matrix(j,k)-matrix(i,k)*temp

end do

end do

end do

!обратный ход

x(N) = matrix(N,N+1)/matrix(N,N)

do i = N-1,1,-1

temp = 0.0

do j = i+1, N

temp = temp + matrix(i,j)*x(j)

end do

temp = matrix(i,N+1) - temp

x(i) = temp/matrix(i,i)

end do

!ответ

do i=1, n

print*,"x(",i,")=",x(i)

enddo

end program

Метод простых итераций

1

2-5

6

9 72

program iter

implicit none

character*64 file_name

real matrix(100,101), x(100), x_old(100), summa, eps

integer i, j, k, N

write(*,*) "Enter file name: "

read(*, *) file_name

!чтение матрицы из файла

open(3, FILE = file_name)

read(3,*) N !размерность матрицы

do i = 1,N

read(3,*) (matrix(i,j), j=1,N+1)

end do

!печать матрицы

do i = 1,N

write(*,*) (matrix(i,j), j=1,N+1)

x(i) = 0.0

x_old(i) = 1.0

end do

write(*,*) "Entereps: "

read(*,*) eps

!проверка на сходимость

do i = 1,N

summa=0.0

do j = 1,N

summa = summa + abs(matrix(i,j))

end do

summa = summa - abs(matrix(i,i));

if (summa > abs(matrix(i,i))) then

stop 'diverges'

end if

end do

!делать итерации, пока не будет достигнута точность

do while(.true.)

do i = 1,N

! проверка, не достигнута ли заданная точность

if(abs(x(i) - x_old(i)) < eps) then

do k=1, N print*,"x(",k,")=",x(k)

enddo

stop

end if

end do

do i = 1,N

x_old(i) = x(i)

end do

do i = 1,N

summa = 0.0;

do j = 1,N

if (i /= j) then

summa = summa + (x_old(j)*matrix(i,j));

end if

end do

x(i) = (matrix(i,N+1)-summa)/matrix(i,i);

end do

end do

end program

Метод Зейделя

1

2-5

6

9 72

program zeid

implicit none

character*64 file_name

real matrix(100,101), x(100), x_old(100), summa, eps

integer i, j, k, N

write(*,*) "Enter file name: "

read(*, *) file_name

!чтение матрицы из файла

open(3, FILE = file_name)

read(3,*) N !размерностьматрицы

do i = 1,N

read(3,*) (matrix(i,j), j=1,N+1)

end do

!печать матрицы

do i = 1,N

write(*,*) (matrix(i,j), j=1,N+1)

x(i) = 0.0

x_old(i) = 1.0

end do

write(*,*) "Entereps: "

read(*,*) eps

!проверка на сходимость

do i = 1,N

summa=0.0

do j = 1,N

summa = summa + abs(matrix(i,j))

end do

summa = summa - abs(matrix(i,i));

if (summa > abs(matrix(i,i))) then

stop 'diverges'

end if

end do

!делать итерации, пока не будет достигнута точность

do while(.true.)

do i = 1,N

! проверка, не достигнута ли заданная точность

if(abs(x(i) - x_old(i)) < eps) then

do k=1, N

print*,"x(",k,")=",x(k)

enddo

stop

end if

end do

do i = 1,N

x_old(i) = x(i)

end do

do i = 1,N

summa = 0.0;

do j = 1,N

if (i /= j) then

summa = summa + (x(j)*matrix(i,j));

end if

end do

x(i) = (matrix(i,N+1)-summa)/matrix(i,i);

end do

end do

end program

Метод главных элементов

1

2-5

6

9 72

real a(3,3), b(3), det_k

real koef

det_k=1

do i=1,3

write(*,*)"Input string ",i

do j=1,4

write(*,*)" Input element ",j

if(j.EQ.4)then

read(*,*)b(i)

else

read(*,*)a(i,j)

end if

enddo

enddo

do i=1,3

do j=i+1,3

koef=a(i,i)/a(j,i)

det_k=det_k*koef

do k=i,3

a(j,k)=a(j,k)*koef

enddo

b(j)=b(j)*koef

enddo

do j=i+1,3

do k=i,3

a(j,k)=a(j,k)-a(i,k)

enddo

b(j)=b(j)-b(i)

enddo

enddo

do i=3,2,-1

do j=1,3

koef=a(i,i)/a(j,i)

det_k=det_k*koef

do k=1,3

a(j,k)=a(j,k)*koef

enddo

b(j)=b(j)*koef

enddo

do k=1,i-1

a(k,i)=a(k,i)-a(i,i)

b(k)=b(k)-b(i)

enddo

enddo

do i=1,3

write(*,*)b(i)/a(i,i)

enddo

end

Метод квадратных корней

1

2-5

6

9 72

complex::matrix(3,4),t(3,4),x1,x2,x3,summ=(0.0,0.0)

do i=1,3

write(*,'(a,i1,a)')"Input string ",i,":"

do j=1,4

write(*,'(6x,a,i1,a)',advance='no')"element ",j," = "

read(*,*)matrix(i,j)

enddo

enddo

t(1,1)=matrix(1,1)**(1.0/2.0)

do j=2,4

t(1,j)=matrix(1,j)/t(1,1)

enddo

do i=2,3

do k=1,i-1

summ=summ+t(k,i)**2.0

enddo

t(i,i)=(matrix(i,i)-summ)**(1.0/2.0)

summ=(0.0,0.0)

do j=i+1,4

do k=1,i-1

summ=summ+t(k,i)*t(k,j)

enddo

t(i,j)=(matrix(i,j)-summ)/t(i,i)

enddo

enddo

x3=t(3,4)/t(3,3)

x2=(t(2,4)-t(2,3)*x3)/t(2,2)

x1=(t(1,4)-t(1,3)*x3-t(1,2)*x2)/t(1,1)

end

Схема Халецкого

1

2-5

6

9 72

dimension matrix(4,5), t(4,5)

real summ

summ=0.0

do i=1,4

write(*,*)"Input string ",i

do j=1,5

write(*,*)" Input element ",j

read(*,*)matrix(i,j)

enddo

enddo

do i=1,4

t(i,1)=matrix(i,1);

enddo

do j=2,5

t(1,j)=matrix(1,j)/t(1,1);

enddo

do i=2,4

do j=2,i

do k=1,j-1

summ=summ+t(i,k)*t(k,j)

enddo

t(i,j)=matrix(i,j)-summ;

enddo

summ=0.0

do j=i+1,5

do k=1,j-1

summ=summ+t(i,k)*t(k,j)

enddo

t(i,j)=(matrix(i,j)-summ)/t(i,j)

enddo

enddo

do i=1,4

do j=1,5

write(*,*)t(i,j)," "

enddo

enddo

end

C ++

Метод Халецкого

#include<iostream>

using namespace std;

int main()

{

while(true)

{

cout.precision(4);

double** matrix=new double*[4];

for(int i=0; i<4; i++)

matrix[i]=new double[5];

cout << "Fill matrix:" << endl;

for(int i=0; i<4; i++)

{

cout << "String " << i+1 << endl;

for(int j=0; j<4; j++)

{

cout << "\telement " << j+1 << ": ";

cin >> matrix[i][j];

};

};

cout << "Fill free members:" << endl;

for(int i=0; i<4; i++)

{

cout << "Coll " << i+1 << ": ";

cin >> matrix[i][4];

};

double** t=new double*[4];

for(int i=0; i<4; i++)

t[i]=new double[5];

for(int i=0; i<4; i++)

t[i][0]=matrix[i][0];

for(int j=1; j<5; j++)

t[0][j]=matrix[0][j]/t[0][0];

for(int i=1; i<4; i++)

{

for(int j=1; j<=i; j++)

{

double sum=0.0;

for(int k=0; k<j; k++)

{

sum=sum+t[i][k]*t[k][j];

};

t[i][j]=matrix[i][j]-sum;

};

for(int j=i+1; j<5; j++)

{

double sum=0.0;

for(int k=0; k<i; k++)

{

sum=sum+t[i][k]*t[k][j];

};

t[i][j]=(matrix[i][j]-sum)/t[i][i];

};

};

for(int i=0; i<4; i++)

{

for(int j=0; j<5; j++)

cout << t[i][j] << "\t";

cout << endl;

};

double x4=t[3][4];

double x3=t[2][4]-t[2][3]*x4;

double x2=t[1][4]-t[1][2]*x3-t[1][3]*x4;

double x1=t[0][4]-t[0][1]*x2-t[0][2]*x3-t[0][3]*x4;

cout << x1 << "_" << x2 << "_" << x3 << "_" << x4 << endl;

};

return 0;

}

Метод квадратных корней

#include<iostream>

#include<complex>

#include<math.h>

using namespace std;

int main()

{

while(true)

{

cout.precision(4);

//double matrix[3][4];

complex<double>** matrix=new complex<double>*[3];

for(int i=0; i<3; i++)

matrix[i]=new complex<double>[4];

cout << "Fill matrix:" << endl;

for(int i=0; i<3; i++)

{

cout << "String " << i+1 << endl;

for(int j=0; j<3; j++)

{

cout << "\telement " << j+1 << ": ";

cin >> matrix[i][j];

};

};

cout << "Fill free members:" << endl;

for(int i=0; i<3; i++)

{

cout << "Coll " << i+1 << ": ";

cin >> matrix[i][3];

};

complex<double>** t=new complex<double>*[3];

for(int i=0; i<3; i++)

t[i]=new complex<double>[4];

t[0][0]=pow(matrix[0][0], (double)1/2);

for(int j=1; j<4; j++)

t[0][j]=matrix[0][j]/t[0][0];

for(int i=1; i<3; i++)

{

complex<double> sum(0.0, 0.0);

for(int k=0; k<i; k++)

{

sum=sum+pow(t[k][i],2.0);

};

t[i][i]=pow(matrix[i][i]-sum,(double)1/2);

for(int j=i+1; j<4; j++)

{

complex<double> sum(0.0,0.0);

for(int k=0; k<i; k++)

{

sum=sum+(t[k][i]*t[k][j]);

};

t[i][j]=(matrix[i][j]-sum)/t[i][i];

};

};

for(int i=0; i<3; i++)

{

for(int j=0; j<4; j++)

cout << t[i][j] << "\t";

cout << endl;

};

complex<double> x1(0.0,0.0);

complex<double> x2(0.0,0.0);

complex<double> x3(0.0,0.0);

x3=t[2][3]/t[2][2];

x2=(t[1][3]-t[1][2]*x3)/t[1][1];

x1=(t[0][3]-t[0][2]*x3*t[0][1]*x2)/t[0][0];

};

return 0;

}

Метод Гаусса

#include <cstdio>

#include "class_system.h"

//#include "check.cpp"

int gauss(array b, int n) {

cout<<"\nFirst:\n";

double** detMatr=new double*[n];

for(int i=0; i<n; i++)

detMatr[i]=new double[n];

for(int i=0; i<n; i++)

for(int j=0; j<n; j++)

detMatr[i][j] = b.A[i][j];

if(checkdeterm(detMatr, n)) {

double matrix2[n][n+1];

for(int i=0; i<n; i++)

for(int j=0; j<n+1; j++)

matrix2[i][j]=0;

for(int i=0; i<n-1; i++) {

for(int k=0; k<n; k++)

for(int j=0; j<n+1; j++)

matrix2[k][j]=0;

double tmp=b.A[i][i];

for(int j=0; j<n+1; j++)

b.A[i][j]=b.A[i][j]/tmp;

for(int k=i; k<n-1; k++) {

double devider=b.A[k+1][i]/b.A[i][i];

for(int l=0; l<n+1; l++) {

matrix2[k+1][l]=b.A[i][l]*devider;

};

};

for(int k=i+1; k<n; k++) {

for(int l=0; l<n+1; l++) {

b.A[k][l]=b.A[k][l]-matrix2[k][l];

};

};

if(i+2<n)

if(b.A[(i+2)% n ][(i+1)% n]==1 && b.A[(i+1)% n][(i+1)% n]!=1) {

double tmp[n+1];

for(int k=0; k<n+1; k++)

tmp[k]=b.A[i+1][k];

for(int k=0; k<n+1; k++)

b.A[i+1][k]=b.A[i+2][k];

for(int k=0; k<n+1; k++)

b.A[i+2][k]=tmp[k];

};

};

double tmp=b.A[n-1][n-1];

for(int j=0; j<n+1; j++)

b.A[n-1][j]=b.A[n-1][j]/tmp;

for(int k=0; k<n; k++) {

for(int l=0; l<n+1; l++) {

cout << b.A[k][l] << '\t';

};

cout << endl;

};

}

else

{

};

}

void array::gauss_2() {

cout<<"\nSecond:\n";

float tmp,xx[inp_size+1];

int i,j,k;

for(i=0;i<inp_size;i++) {

tmp=A[i][i];

for(j=inp_size;j>=i;j--) A[i][j]/=tmp;

for(j=i+1;j<inp_size;j++) {

tmp=A[j][i];

for(k=inp_size;k>=i;k--)

A[j][k]-=tmp*A[i][k];

}

}

xx[inp_size-1]=A[inp_size-1][inp_size];

for(i=inp_size-2;i>=0;i--) {

xx[i]=A[i][inp_size];

for(j=i+1;j<inp_size;j++)

xx[i]-=A[i][j]*xx[j];

}

printf("\nUnknowns:\n");

for (i=0;i<inp_size;i++)

printf("x%d=%3.3f\n",i+1,xx[i]);

}

Метод Крамера

#include <iostream>

#include <math.h>

using namespace std;

const int nMax = 100;

int n = 0;

double SoLE[nMax][nMax + 1];

double result[nMax];

bool agreed = false;

double factor;

double e = 0.0001;

double matrix[nMax][nMax];

double temp, sum, counter, det;

int i, j, k, m;

double Det()

{

counter = 0;

for(i = 0; i < n - 1; i++)

{

if(matrix[i][i] == 0)

{

for(j = i + 1; j < n && matrix[i][i] == 0; j++)

{

if(matrix[j][i] != 0)

{

for(k = 0; k < n + 1; k++)

{

temp = matrix[i][k];

matrix[i][k] = matrix[j][k];

matrix[j][k] = temp;

counter++;

}

}

}

}

for(j = i + 1; j < n; j++)

{

factor = -(matrix[j][i]/matrix[i][i]);

for(k = 0; k < n + 1; k++)

{

matrix[j][k] += matrix[i][k]*factor;

}

}

}

sum = matrix[0][0];

for(i = 1; i < n; i++)

{

sum *= matrix[i][i];

}

return pow(-1, counter)*sum;

}

double startdDet()

{

for(i = 0; i < n; i++)

{

for(j = 0; j < n; j++)

{

matrix[i][j] = SoLE[i][j];

}

}

return Det();

}

double modDet(int num)

{

for(i = 0; i < n; i++)

{

for(j = 0; j < n; j++)

{

if(j != num)

{

matrix[i][j] = SoLE[i][j];

}

else

{

matrix[i][j] = SoLE[i][n];

}

}

}

return Det();

}

void Cramer()

{

det = startdDet();

if(det == 0)

{

cout <<"determinant is 0."<< endl;

agreed = false;

}

else

{

for(m = 0; m < n; m++)

{

result[m] = modDet(m)/det;

}

cout << endl;

agreed = true;

}

}

int main()

{

do

{

cout <<"Enter number of equations (1 - 100): ";

cin >> n;

}

while(n < 1 || n > 100);

cout <<"--------------------------"<< endl;

for(i = 0; i < n; i++)

{

for(j = 0; j < n; j++)

{

cout <<"Input a("<< i + 1<<','<< j + 1 <<"): ";

cin >> SoLE[i][j];

}

cout <<"Input b("<< i + 1 <<"): ";

cin >> SoLE[i][n];

}

Cramer();

cout <<"--------------------------"<< endl;

if(agreed)

{

for(i = 0; i < n; i++)

{

cout <<"X("<< i + 1 <<") = "<< result[i] << endl;

}

}

else

{

cout <<"impossible to solve the system of linear equations with this method."<< endl;

}

cout << endl;

return 1;

}

Метод главных элементов

#include "stdafx.h"

#include <iostream>

using namespace std;

int main()

{

const int n = 3;

double det_k = 1;

double a[n][n];

double b[n];

cout.precision(3);

for(int i=0; i<n; i++)

{

cout << "input string " << i+1 << endl;

for(int j=0; j<n; j++)

{

cout << "\telemet " << j+1 << ": ";

cin >> a[i][j];

};

};

for(int i=0; i<n; i++)

cin>>b[i];

for(int i = 0; i < n; i++)

{

for(int j = i+1; j < n; j++)

{

double koef = a[i][i] / a[j][i];

det_k *= koef;

for(int k = i; k < n; k++)

{

a[j][k] *= koef;

}

b[j] *= koef;

}

for(int j = i+1; j < n; j++)

{

for(int k = i; k < n; k++)

{

a[j][k] -= a[i][k];

}

b[j] -= b[i];

}

}

cout<<endl<<"Triangle matrix:\n";

for(int i = 0; i < n; i++)

{

for(int j = 0; j < n; j++)

cout<<a[i][j]<<" ";

cout<<" | "<<b[i]<<endl;

}

for(int i = n-1; i > 0; i--)

{

for(int j = 0; j <= i-1; j++)

{

double koef = a[i][i]/a[j][i];

det_k *= koef;

for(int k = 0; k < n; k++)

a[j][k] *= koef;

b[j] *= koef;

}

for(int k = 0; k < i; k++)

{

a[k][i] -= a[i][i];

b[k] -= b[i];

}

}

cout<<endl<<"Diag matrix:\n";

for(int i = 0; i < n; i++)

{

for(int j = 0; j < n; j++)

cout<<a[i][j]<<" ";

cout<<" | "<<b[i]<<endl;

}

cout<<"Solve:\n";

for(int i = 0; i < n; i++)

{

cout<<"x"<<i<<" = "<< b[i]/a[i][i]<<endl;

}

return 0;

}

Метод итерации

#include <cstdlib>

#include <cmath>

#include "class_system.h"

//#include "check.cpp"

using namespace std;

int iter(array b, int n) {

cout<<"\n[First]\n";

double eps;

cout << "Enter observational error: ";

cin >> eps;

for(int i=0; i<n; i++) {

double sum=0.0;

for(int j=0; j<n; j++) {

if(i!=j)

sum+=fabs(b.A[i][j]);

};

if(fabs(b.A[i][i])<sum) {

FILE* f=freopen("resultFile", "w", stdout);

cout << "Not equation" << endl;

return 1;

};

};

double* oldResult=new double[n];

double* newResult=new double[n];

for(int i=0; i<n; i++)

oldResult[i]=0;

int k=0;

while(true) {

for(int i=0; i<n; i++) {

double sum=b.A[i][n];

for(int j=0; j<n; j++)

if(i!=j)

sum+= (-oldResult[j]);

newResult[i]=(sum)/b.A[i][i];

};

if(epsChecking(oldResult, newResult, n)) {

for(int i=0; i<n; i++)

oldResult[i]=newResult[i];

k++;

}

else {

FILE* f=freopen("resultFile", "w", stdout);

for(int i=0; i< n; i++)

cout << newResult[i] << " ";

return 0;

};

};

}

void array::iter_2() {

cout<<"\n\n[Second]\n";

double eps = 0.0001; // Engineer accuracy.

double a[inp_size][inp_size]; // Original matrix.

double b[inp_size]; // Column of free terms.

for(int i=0;i<inp_size;i++) {

for(int j(0);j<inp_size;j++) {

a[i][j]=A[i][j];

}

}

for (int i=0;i<inp_size;i++) {

b[i]=A[i][inp_size+1];

}

double alpha[inp_size][inp_size]; // Buffer matrix.

double beta[inp_size]; // buffer column.

for(int i=0;i<inp_size;i++) {

for(int j=0;j<inp_size;j++) {

if(i==j) alpha[i][j]=0;

else alpha[i][j]=-a[i][j]/a[i][i];

beta[i]=b[i]/a[i][i];

cout<<alpha[i][j]<<"  ";

}

cout<<endl;

}

double next[inp_size];

int stepIter=0;

int quantity=0;

double prev[inp_size];

for(int i=0;i<inp_size;i++) {

prev[i] = beta[i];

cout<<beta[i]<<"   ";

}

for(stepIter;stepIter<5;stepIter++) {

cout << "\nStep " << stepIter << endl;

for(int index=0;index<inp_size;index++) {

next[index] += beta[index];

for(int j=0;j<inp_size;j++) {

next[index] += prev[j] * alpha[index][j];

}

cout << " = " << next[index] <<"   ";

cout<<endl;

if(abs(next[index]-prev[index]) < eps) {

quantity++;

if(quantity == inp_size) {

cout<<"|X(k+1)-X(k)|< eps"<<endl;

break;

}

}

}

for(int i=0;i<inp_size;i++) {

prev[i] = next[i];

next[i] = 0;}

quantity=0;

}

cout << "The number of iterations: " << stepIter << endl;

}

Метод Зейделя

#include <cstdlib>

#include <cmath>

#include "class_system.h"

using namespace std;

int zeidel(array b, int size) {

double eps;

cout << "Enter observational error: ";

cin >> eps;

for(int i=0; i<size; i++) {

double sum=0.0;

for(int j=0; j<size; j++) {

if(i!=j)

sum+=fabs(b.A[i][j]);

};

if(fabs(b.A[i][i])<sum) {

FILE* f=freopen("resultFile", "w", stdout);

cout << "Not equation" << endl;

return 1;

};

};

double* oldResult=new double[size];

double* newResult=new double[size];

for(int i=0; i<size; i++)

oldResult[i]=0;

int k=0;

while(true) {

for(int i=0; i<size; i++) {

double sum=b.A[i][size];

for(int j=0; j<size; j++) {

if(i!=j) {

sum+=(-oldResult[j]);

};

};

newResult[i]=(sum)/b.A[i][i];

oldResult[i]=newResult[i];

};

if(epsChecking(oldResult, newResult, size)) {

for(int i=0; i<size; i++)

oldResult[i]=newResult[i];

k++;

}

else {

FILE* f=freopen("resultFile", "w", stdout);

for(int i=0; i< size; i++)

cout << newResult[i] << " ";

return 0;

};

};

}

Вывод

Существует множество методов решения систем линейных уравнений. Мы изучили метод Гаусса, метод простой итерации, метод Зейделя, метод Крамера, метод Халецкого, метод главных элементов и метод квадратных корней.

Наиболее распространенным приемом решения систем линейных уравнений является метод Гаусса. Но метод Гаусса – частный случай метода главных элементов. Схема Халецкого удобна для работы на вычислительных машинах. При большом числе неизвестных удобнее использовать метод итерации.

Метод удобнее выбирать в зависимости от того, какого вида СЛАУ нужно решить.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]