Изучение понятия обусловленности вычислительной задачи
(Лабораторная работа №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 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|