This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
courses:computational_mathematics:prac2 [2021/06/14 19:25] andrey.suchkov [Постановка задачи] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Практическая работа №2: Изучение понятия обусловленности вычислительной задачи ====== | ||
- | ===== Цель работы ===== | ||
- | Исследование обусловленности задачи нахождения корня уравнения на примере линейной функции. | ||
- | ===== Основные теоретические положения ===== | ||
- | Под обусловленностью вычислительной задачи понимают чувствительность ее решения к малым погрешностям входных данных. | ||
- | |||
- | Задачу называют хорошо обусловленной, если малым погрешностям входных данных отвечают малые погрешности решения, и плохо обусловленной, если возможны сильные изменения решения. Количественной мерой степени обусловленности вычислительной задачи является число обусловленности, которое можно интерпретировать как коэффициент возможного возрастания погрешностей в решении по отношению к вызвавшим их погрешностям входных данных. Пусть между абсолютными погрешностями входных данных $x$ и решения $y$ установлено неравенство: | ||
- | \[ | ||
- | \Delta(y^*) \leqslant \nu_{\Delta}\Delta(x^*), | ||
- | \] | ||
- | где $ x^* $ и $ y^* $ -- приближённые входные данные и приближённое решение соответственно. Тогда величина $ \nu_{\Delta} $ называется абсолютным числом обусловленности. | ||
- | |||
- | Если же установлено неравенство | ||
- | \[ | ||
- | \delta(y^*) \leqslant \nu_{\delta}\delta(x^*), | ||
- | \] | ||
- | между относительными ошибками данных и решения, то величину $ \nu_{\delta} $ называют относительным числом обусловленности. Для плохо обусловленной задачи $ \nu \gg 1 $. Грубо говоря, если $ \nu = 10^N $, где $ \nu $ -- относительное число обусловленности, то порядок $ N $ показывает число верных цифр, которое может быть утеряно в результате по сравнению с числом верных цифр входных данных. | ||
- | |||
- | Ответ на вопрос о том, при каком значении $ \nu $ задачу следует признать плохо обусловленной, зависит, с одной стороны, от предъявляемых требований к точности решения и, с другой, -- от уровня обеспечиваемой точности исходных данных. Например, если требуется найти решение с точностью 0.1%, а входная информация задается с точностью 0.02%, то уже значение $ \nu = 10 $ сигнализирует о плохой обусловленности. Однако, при тех же требованиях к точности результата, гарантия, что исходные данные задаются с точностью не ниже 0.0001%, означает, что при $ \nu = 10^3 $ задача хорошо обусловлена. | ||
- | |||
- | Если рассматривать задачу вычисления корня уравнения $ y = f(x) $, то роль числа обусловленности будет играть величина | ||
- | \[ | ||
- | \nu_{\Delta} = \frac1{|f'(\xi)|}, | ||
- | \] | ||
- | где $ \xi $ -- корень уравнения. | ||
- | |||
- | ===== Постановка задачи ===== | ||
- | Используя программы-функции ''bisect'' и ''Round'' из файла //condition.m//, исследовать обусловленность задачи нахождения корня уравнения $ f(x) = 0 $ для линейной функции $ f(x) = c(x - d) $. Значения функции $ f(x) $ следует вычислить приближенно с точностью ''delta'', варьируемой в пределах 0.1÷0.000001. | ||
- | |||
- | ===== Порядок выполнения работы ===== | ||
- | - Графически или аналитически отделить корень уравнения $ f(x) = 0 $, т.е. найти отрезки $ [a, b] $, на которых функция удовлетворяет условиям применимости метода бисекции. | ||
- | - Запустить m-скрипт ''condition.m''. Ввести значения, необходимые для запуска программы. | ||
- | - Провести вычисления по программе, варьируя значения параметров ''c'' (тангенс угла наклона прямой), ''epsilon'' (точность вычисления корня) и ''delta'' (точность задания исходных данных). | ||
- | - Проанализировать полученные результаты и обосновать выбор точности ''epsilon'' вычисления корня. Сопоставить полученные теоретические результаты с экспериментальными данными. | ||
- | |||
- | <note important> | ||
- | Значение параметра $ d $ выбирается каждым студентом самостоятельно и согласовывается с преподавателем. | ||
- | </note> | ||
- | |||
- | ===== Содержание отчёта ===== | ||
- | * Цель работы. | ||
- | * Краткое изложение основных теоретических понятий. | ||
- | * Постановка задачи с кратким описанием порядка выполнения работы. | ||
- | * Таблицы с вычислениями при различных вариациях параметров. | ||
- | * Краткие выводы по полученным результатам. | ||
- | * Общий вывод по проделанной работе. | ||
- | * Код программы. | ||
- | |||
- | ===== Тексты программ ===== | ||
- | ==== Исследование обусловленности задачи нахождения корня линейного уравнения ==== | ||
- | <file octave condition.m> | ||
- | ## TASK2 | ||
- | ## Studying the concept of conditionality | ||
- | ## of a computational problem | ||
- | format long g | ||
- | |||
- | function [x, k] = bisect (a, b, c, d, epsilon, delta) | ||
- | Eps = abs (epsilon) * 2; | ||
- | fa = f (a, c, d, delta); | ||
- | fb = f (b, c, d, delta); | ||
- | k = 0; | ||
- | | ||
- | if (fa * fb > 0) | ||
- | error ("\aInvalid interval setting!!!\n") | ||
- | endif | ||
- | | ||
- | if (epsilon <= 0) | ||
- | error ("\aInvalid accuracy setting!!!\n") | ||
- | endif | ||
- | | ||
- | if (fa == 0) | ||
- | x = fa; | ||
- | return | ||
- | endif | ||
- | | ||
- | if (fb == 0) | ||
- | x = fb; | ||
- | return | ||
- | endif | ||
- | | ||
- | while (b - a >= Eps) | ||
- | x = 0.5 * (a + b); | ||
- | y = f (x, c, d, delta); | ||
- | | ||
- | if (y == 0) | ||
- | return | ||
- | elseif (y * fa < 0) | ||
- | b = x; | ||
- | else | ||
- | a = x; | ||
- | fa = y; | ||
- | endif | ||
- | | ||
- | k++; | ||
- | endwhile | ||
- | endfunction | ||
- | |||
- | function y = f (x, c, d, delta) | ||
- | s = c * (x - d); | ||
- | S = s / delta + merge (s / delta < 0, -0.5, 0.5); | ||
- | | ||
- | s = S * delta; | ||
- | y = Round (s, delta); | ||
- | endfunction | ||
- | |||
- | function r = Round (x, delta) | ||
- | if (delta <= 1e-9) | ||
- | error ("\aInvalid setting of rounding precision!!!\n") | ||
- | endif | ||
- | | ||
- | r = delta * (x / delta + merge (x > 0, 0.5, -0.5)); | ||
- | endfunction | ||
- | |||
- | ## Begin script | ||
- | epsilon = input ("Enter 'eps': "); | ||
- | c = input ("Enter 'c': "); | ||
- | d = input ("Enter 'd': "); | ||
- | a = input ("Enter 'a': "); | ||
- | b = input ("Enter 'b': "); | ||
- | delta = input ("Enter 'delta': "); | ||
- | [x, k] = bisect (a, b, c, d, epsilon, delta); | ||
- | printf ("\nx = %.14f,\tk = %u\n", x, k), format short | ||
- | </file> |