RSS    

   Контрольная работа: Обусловленность матрицы

Контрольная работа: Обусловленность матрицы

Министерство образования и науки российской федерации

Федеральное агентство по образованию

Новосибирский государственный технический университет

Бердский филиал

Расчетно-графическая работа

по курсу: «Вычислительная математика»

Выполнила:

Студентка II курса

Булгакова Н.

Группы ВТБ-81

Проверил:

Преподаватель

Голубева Елена Николаевна

г. 362964Бердск,

2010


Задание 1 Обусловленность матрицы

Задание: Дана система  уравнений ax=b порядка n. Исследовать зависимость погрешности решения x от погрешностей правой части системы b.

погрешность уравнение координата интерполяция дифференциальный

1.  Задать матрицу системы A и вектор правой части b, найти решение x системы Ax=b с помощью метода Гаусса.

2.  Принимая решение x, полученное в п.1, за точное,  вычислить вектор

относительных погрешностей решений  систем ,где компоненты векторов  вычисляются по формулам:

(-произвольная величина погрешности).

3.  На основе вычисленного вектора d  построить гистограмму. По гистограмме определить компоненту  , вектора b, которая оказывает наибольшее влияние на погрешность решения.

4.  Вычислить число обусловленности cond(A) матрицы A.

5.  Оценить теоретически погрешность решения  по формуле:


Сравнить значение  со значением практической погрешности  Объяснить полученные результаты.

Решение

1.  Задаём матрицу А.

Для заполнения используем код программы zapolnenie.cpp (см. приложение)

#include <iostream.h>

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <windows.h>

#include <dos.h>

main()

{

         double matr[100][100];

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

{

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

            matr[i][j]= 1000/(3*(pow(0.1*21*i*j,2))+pow(0.1*21*i*j,3));

}

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

{

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

printf("%10.4f",matr[j][i]);

printf("\n");

}

        

   getchar();

}

Результат работы zapolnenie:

      

Найдем решение полученной матрицы используя программу gauss.cpp (см приложение)

Исходный  код   gauss.cpp:

#include <iostream.h>

#include <stdio.h>

#include <windows.h>

#include <math.h>

#include <conio.h>

#include <dos.h>

const int sz=6;


double A[sz][sz]={

            {44.4622,    7.8735,    2.7092,    1.2432,    0.6719,     0.4038},

             {7.8735,    1.2432,    0.4038,    0.1789,    0.0945,     0.0558},

             {2.7092,    0.4038,    0.1278,    0.0558,    0.0292,     0.0172},

             {1.2432,    0.1789,    0.0558,    0.0242,    0.0126,     0.0074},

             {0.6719,    0.0945,    0.0292,    0.0126,    0.0065,     0.0038},

             {0.4038,    0.0558,    0.0172,    0.0074,    0.0038,     0.0022}

                               }    ;

double  F[sz]={21.00,21.00,21.00,21.00,21.00,21.00} ;

double  X[sz];

double  b[sz+1],par;

//   функция вывода матрицы на экран

void Viv(double A[sz][sz])

{

int i,j;

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

{

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

   printf(" %.4f  ",A[i][j]); //вывод на экрам исходной матрицы с заданным количеством знаков после запятой (5f)

   printf(" %.4f  ",F[i]);

   cout<<endl;

}

 system("pause");

}

///////////////  функция решения методом Гаусса 

void Resh(double A[sz][sz],double F[sz],double X[sz])

{

int i,j,k;

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

         {

                   // проверяем первый элемент

                            if (A[k][k]==0) //проверка на неноль

                                      {

                                      for (i=k;A[i][k]==0;i++);      // находим ненулевой 1й элемент

                                      for(j=k;j<sz;j++)               // меняем строки  в матрице

                                               {

                                               par=A[k][j];    //смена строк в матрице

                                               A[k][j]=A[i][j]; //путем записи в par и извлечения из него

                     A[i][j]=par;

                                               }

                par=F[k]; // смена строк  в ответе

                F[k]=F[i];

                F[i]=par;

                            }

                   // получаем 1й элемент единицу   (делим всю первую строку на a1,1  )

                            par=A[k][k]; //пишем в par первый элемент

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

         A[k][i]=A[k][i]/par;

         F[k]=F[k]/par;      // делим ответ на 1й


      // нулевой столбец

                            for(int j=k+1;j<sz;j++)

                                      {

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

               b[i]=A[k][i]*A[j][k];

               b[sz]= F[k]*A[j][k];

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

               A[j][i]-=b[i];

               F[j]-=b[sz];

                                      }

         }

 for(i=sz-1;i>=0;i--) //обратка

         {

                   par=0;

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

      par+=A[i][sz-j-1]*X[sz-1-j];

                   X[i]=F[i]-par;

         }

}

//функция - точка входа в программу

void main()

{

  Viv(A);              // выводим матрицу

  Resh(A,F,X);   // решаем матрицу A методом Гаусса

  for(int i=0;i<sz;i++)  printf("\nX[%d]= %.5f \n\r",i,X[i]);   // вывод результата


 system("pause");

}

Результат работы gauss:

====================================================

точное

====================================================

44.4622   7.8735   2.7092   1.2432   0.6719   0.4038   21.0000

 7.8735   1.2432   0.4038   0.1789   0.0945   0.0558   21.0000

 2.7092   0.4038   0.1278   0.0558   0.0292   0.0172   21.0000

 1.2432   0.1789   0.0558   0.0242   0.0126   0.0074   21.0000

 0.6719   0.0945   0.0292   0.0126   0.0065   0.0038   21.0000

 0.4038   0.0558   0.0172   0.0074   0.0038   0.0022   21.0000

Для продолжения нажмите любую клавишу . . .

X[0]= 872.15582

X[1]= -16329.24792

X[2]= 10011.59140

X[3]= 111650.80126

X[4]= -26697.87796

X[5]= -144076.29603

Для продолжения нажмите любую клавишу . . .

======================================================


2.  Вычисляем вектор  d.

Величина погрешности, вносимой в правую часть системы –  1%.

Сформируем векторы b (по заданному закону)

b1 b2 b3 b4 b5 b6
20,79 21 21 21 21 21
21 20,79 21 21 21 21
21 21 20,79 21 21 21
21 21 21 20,79 21 21
21 21 21 21 20,79 21
21 21 21 21 21 20,79

Для каждого из них найдем решение матрицы, используя gauss

Страницы: 1, 2, 3, 4, 5, 6, 7, 8


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.