Главная | Обратная связь
МегаЛекции

ИЗУЧЕНИЕ ПОНЯТИЯ Обусловленности ВЫЧИСЛИТЕЛЬНОЙ задачи





(Лабораторная работа №2)

 

Под обусловленностью вычислительной задачи понимают чувствительность ее решения к малым погрешностям входных данных.

Задачу называют хорошо обусловленной, если малым погрешностям входных данных отвечают малые погрешности решения, и плохо обусловленной, если возможны сильные изменения решения. Количественной мерой степени обусловленности вычислительной задачи является число обусловленности, которое можно интерпретировать как коэффициент возможного возрастания погрешностей в решении по отношению к вызвавшим их погрешностям входных данных. Пусть между абсолютными погрешностями входных данных Х и решения У установлено неравенство

D(y*) £ nD D(x*),

где x* и y* - приближенные входные данные и приближенное решение.

Тогда величина nD называется абсолютным числом обусловленности. Если же установлено неравенство

d(y*) £ nd d(x*)

между относительными ошибками данных и решения, то величину nd называют относительным числом обусловленности. Для плохо обусловленной задачи n>>1. Грубо говоря, если n=10N, где n - относительное число обусловленности, то порядок N показывает число верных цифр, которое может быть утеряно в результате по сравнению с числом верных цифр входных данных.

Ответ на вопрос о том, при каком значении n задачу следует признать плохо обусловленной, зависит, с одной стороны, от предъявляемых требований к точности решения и, с другой, - от уровня обеспечиваемой точности исходных данных. Например, если требуется найти решение с точностью 0.1%, а входная информация задается с точностью 0.02%, то уже значение n=10 сигнализирует о плохой обусловленности. Однако, при тех же требованиях к точности результата, гарантия, что исходные данные задаются с точностью не ниже 0.0001%, означает, что при n=103 задача хорошо обусловлена.

Если рассматривать задачу вычисления корня уравнения Y=f(X), то роль числа обусловленности будет играть величина

где x0 - корень уравнения.



В работе предлагается, используя программы - функции BISECT и Round из файла metods.cpp (файл заголовков metods.h, директория LIBR1), исследовать обусловленность задачи нахождения корня уравнения для линейной функции . Значения функции следует вычислить приближенно с точностью Delta, варьируемой в пределах от 0.1 до 0.000001.

Порядок выполнения работы должен быть следующим:

1) Графически или аналитически отделить корень уравнения , т.е. найти отрезки [Left, Right], на которых функция удовлетворяет условиям применимости метода бисекции (см. Подразделы 3.1 и 3.2).

2) Составить подпрограмму вычисления функции для параметров c и d, вводимых с клавиатуры. Предусмотреть округление вычисленных значений функции с использованием программы-функции Round с точностью Delta, также вводимой с клавиатуры.

3) Составить головную программу, вычисляющую корень уравнения с заданной точностью Eps и содержащую обращение к подпрограмме f(x), программам-функциям BISECT, Round и представление результатов.

4) Провести вычисления по программе, варьируя значения параметров c (тангенс угла наклона прямой), Eps (точность вычисления корня) и Delta (точность задания исходных данных).

5) Проанализировать полученные результаты и обосновать выбор точности Eps вычисления корня. Сопоставить полученные теоретические результаты с экспериментальными данными.

Значение параметра d выбирается каждым студентом самостоятельно и согласовывается с преподавателем.

Текст программы для исследования обусловленности задачи нахождения корня уравнения представлен ниже.

/**********************************************************************/

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <methods.h>

#include <conio.h>

double delta,c,d;

void main()

{

int k;

long int s;

float a1,b1,c1,d1,eps1,delta1;

double a,b,eps,x;

double F(double);

printf("Ââåäèòå eps:");

scanf("%f",&eps1);

eps = eps1;

printf("Ââåäèòå c:");

scanf("%f",&c1);

c = c1;

printf("Ââåäèòå d:");

scanf("%f",&d1);

d = d1;

printf("Ââåäèòå a:");

scanf("%f",&a1);

a = a1;

printf("Ââåäèòå b:");

scanf("%f",&b1);

b = b1;

printf("Ââåäèòå delta:");

scanf("%f",&delta1);

delta = delta1;

x = BISECT(a,b,eps,k);

printf("x=%f k=%d\n",x,k);

}

double F(double x)

{

extern double c,d,delta;

double s;

long int S;

s = c*(x - d);

if( s/delta < 0 )

S = s/delta - .5;

else

S = s/delta + .5;

s = S*delta;

s = Round( s,delta );

return(s);

}

/********************************************************/

 





Рекомендуемые страницы:

Воспользуйтесь поиском по сайту:
©2015- 2020 megalektsii.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.