Gauss_Haleckij(n, a, b, x);

printf("\n Reshenie sistemy uravn.:\n");

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

printf("%10.5f", x[i]);

printf("\n");

Return 0;

}

Результат работы программы:

Таким образом,

x1=5.0 x2=2.0 x3=3.0

 

 

Решение системы линейных алгебраических уравнений

итерационным методом Гаусса-Зайделя

В головной программе необходимо:

1. описать прототип функции решения системы уравнений:

int Gauss_Zaidel(int n, float a[n][n], float b[n], float eps, int count, float x[n]);

2. ввести значение переменной n – порядок системы уравнений,

3. описать массивы:

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор решения (вектор неизвестных)

4. ввести массивы a[n][n]иb[n],

5.ввести погрешность вычислений eps и максимальное количество итераций count,

6. обратиться к программе решения системы уравнений:

Gauss_Zaidel(n, a, b, eps, count, x);

7. вывести на экран терминала (в текстовый файл) вектор решения.

Пример: решить систему уравнений

x1 + 0,17x2 - 0,25x3 + 0,54x4 = 0,3;

0,47x1 + x2 + 0.67x3 - 0,32x4 = 0,5;

-0,11x1 + 0,35x2 + x3 - 0,74x4 = 0,7;

0,55x1 + 0,43x2 + 0,36x3 - x4 = 0,9;

В этом случае n=4;

1.0 0,17 0,25 0,54 0,3

a[4][4]= 0,47 1.0 0.67 0,32 b[4] = 0,5

-0,11 0,35 1.0 0,74 0,7

0,55 0,43 0,36 1.0 0,9

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

int Gauss_Zaidel(int n, float a[n][n], float b[n], float eps, int count, float x[n]);

int main(int argc, char **argv)

{

int n;// порядок системы уравнений

int count;// заданное количество итераций

int i,j;// рабочие переменных

printf("\n porjadok sistemy uravn. n=");

scanf("%d", &n);

float a[n][n];// матрица коэффициентов системы уравнений

float b[n];// вектор свободных членов

float x[n];// вектор решения системы уравнений

float eps;// заданная точность вычислений

printf("\n vvedite matrizu koeff. sistemy postrochno:\n");

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

{

printf("\n stroka %d (%d chisel):\n", i+1, n);

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

scanf("%f", &a[i][j]);

}

printf("\n");

printf("\n vvedite vektor svobodn. chlenov (%d chisel):\n", n);

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

scanf("%f", &b[i]);

printf("\n");

printf("\n pogreshn. vychisl. eps=");

scanf("%g", &eps);

printf("\n max kolich. iteraciy count=");

scanf("%d", &count);

Gauss_Zaidel(n, a, b, eps, count, x);

printf("\n Reshenie sistemy uravn.:\n");

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

printf("%10.5f", x[i]);

printf("\n");

Return 0;

}

Результат работы программы:

Таким образом,

x1=0.441 x2=-0.363 x3=1.667 x4=0.3935

 

Решение системы несовместных линейных уравнений
методом наименьших квадратов

В головной программе необходимо:

1. описать прототип функции решения системы уравнений:

int nesovmest(int n, int kk, float a[kk][n], float b[kk], float x[n], float y[kk], float *s0);

2. ввести значение переменной n – порядок системы уравнений,

3. ввести значение переменной k – количество уравнений (k>n),

4. описать массивы:

float a[n][n]; // матрица коэффициентов системы уравнений

float b[n]; // матрица свободных членов

float x[n]; // вектор оценок неизвестных

float y[n]; // вектор невязок

5. ввести массивы a[n][n]иb[n],

6. обратиться к программе решения системы уравнений:

nesovmest(n, k, a, b, x, y, &s0);

7. вывести на экран терминала (в текстовый файл) вектор оценок неизвестных, вектор невязок и среднеквадратическую невязку

Пример: решить систему уравнений

2x1 + 3x2 = 5;

x1 - 2x2 = 7;

2x1 - x2 = 8;

В этом случае n=2, k=3;

2 3 5

a[3][2]= 1 -2 b[3]= 7

2 -1 9

Головная программа:

#include <stdio.h>

#include <math.h>

#include <conio.h>

int nesovmest(int n, int kk, float a[kk][n], float b[kk], float x[n], float y[kk], float *s0);

int main(int argc, char **argv)

{

int n;// количество неизвестных

int k;// количество уравнений (k>n)

float s0;// среднеквадратическая невязка

int i,j;// рабочие переменные

printf("\n Kol-vo neizvestn. n=");

scanf("%d", &n);

printf("\n Kol-vo uravnen. (k>n) k=");

scanf("%d", &k);

float a[k][n];//матрица коэффициентов системы уравнений

float b[k];// вектор свободных членов

float x[n];// вектор оценок неизвестных

float y[k];// вектор невязок

printf("\n vvedite matrizu koeff. sistemy postrochno:\n");

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

{

printf("\n stroka %d (%d znachenij) :\n", i+1, n);

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

scanf("%f", &a[i][j]);

}

printf("\n");

printf("\n vvedite vektor svobodn. chlenov (%d znachenij):\n", k);

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

scanf("%f", &b[i]);

printf("\n");

nesovmest(n, k, a, b, x, y, &s0);

printf("\n Ocenki neizvestnyh:\n");

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

printf("%10.5f", x[i]);

printf("\n");

printf("\n Vector nevjazok:\n");

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

printf("%10.5f", y[i]);

printf("\n");

printf("\nSrednekv. nevjazka: %e\n", s0);

Return 0;

}

Результат работы программы:

Таким образом,

x1=3.902 x2=-1.057

Решение системы нелинейных и трансцендентных уравнений
методом Стеффенсена

В головной программе необходимо:

1. описать прототип функции решения системы уравнений:

int Steffensen(int n, float eps, int count, float x[n], float y[n]);

2. ввести значение переменной n – количество неизвестных,

3. ввести значение переменной eps – погрешность вычислений,

4. ввести значение переменной count – заданное количество итераций,

5. описать массивы:

float x[n]; // вектор решения системы уравнений

float y[n]; // вектор невязок

6. описать систему уравнений в функции:

void pr_chasti(int n, float x[n], float b[n])

в виде b[i]=b(x[j]); i,j=0…n-1,

7. ввести массив x[n]– вектор начальных приближений неизвестных,

8. обратиться к программе решения системы уравнений: