User Tools

Site Tools


courses:computational_mathematics:prac2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
courses:computational_mathematics:prac2 [2021/01/28 21:56]
andrey.suchkov [Исследование обусловленности задачи нахождения корня линейного уравнения]
courses:computational_mathematics:prac2 [2022/06/28 18:17]
andrey.suchkov ↷ Page name changed from courses:computational_mathematics:task2 to courses:computational_mathematics:prac2
Line 1: Line 1:
-====== Практическая работа №2: Изучение понятия обусловленности вычислительной задачи ​======+====== Практическая работа №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'​(\bar x)|}, +
-\] +
-где $ \bar x $ -- корень уравнения.+
  
 ===== Постановка задачи ===== ===== Постановка задачи =====
-Используя программы-функции ''​bisect''​ и ''​Round''​ из файла //​condition.m//,​ исследовать ​обусловленность ​задачи нахождения корня уравнения $ f(x= 0 $ для ​линейной ​функции $ f(x) = c(- d) $. Значения функции ​f(x) $ следует вычислить приближенно ​с точностью ''​delta'', ​варьируемой в пределах ​от 0.1 до 0.000001.+Построить интерполяционный ​многочлен ​по 2, 3, 4, 5 и 6 узлам (равноотстоящим и чебышёвским) для функции $ f(x) = \cfrac A{x^2 + px + q} $ на промежутке [a, b] по равноотстоящим и по чебышёвским узлам. Найти фактическую погрешность ​и сравнить её с теоретической оценкой.
  
 ===== Порядок выполнения работы ===== ===== Порядок выполнения работы =====
-  - Графически или аналитически ​отделить корень уравнения $ f(x) = 0 $, т.е. найти отрезки $ [a, b] $, на которых ​функция удовлетворяет условиям применимости метода бисекции. +  - Реализовать функцию ''​f()'' ​для вычисления значений в функции $ f(x) $. 
-  - Составить подпрограмму вычисления функции $ f(x) = c(x d) $ для параметров $ c $ и $ d $, вводимых с клавиатуры. Предусмотреть округление вычисленных значений функции $f(x)$ ​с использованием программы-функции ''​Round''​ с точностью ''​delta'', ​также вводимой с клавиатуры+  ​Реализовать ​функцию ''​df()'', ​вычисляющая $ n $-ую производную ​функции $ f(x) $. Данную ​функцию можно реализовать с помощью ''​switch'', ​предварительно посчитав производные в символьном ​виде, например, в Wolfram
-  - Составить головную программу, вычисляющую ​корень уравнения с заданной точностью ''​epsilon''​ и содержащую обращение к подпрограмме ​''​F''​, программам-функциям ''​bisect''​, ''​Round''​ и представление результатов. +  - Реализовать функцию, вычисляющую ​интерполяционный многочлен по методу ​Лагранжа ​''​lagrange()'' ​(**для нечётных вариантов**) ​или Ньютона ​''​newti()'' ​(**для чётных вариантов**)
-  - Провести вычисления по программе, варьируя значения параметров ''​c''​ (тангенс угла наклона прямой), ''​epsilon''​ (точность вычисления корня) ​и ''​delta'' ​(точность задания исходных данных). +  - Построить ​график полученного ​интерполяционного многочлена $ n $-го порядка по равномерной сетке и функции $ f(x) $ в одном окне. Отметить на графике узлы ​интерполяции. Выписать полученный интерполяционный многочлен с точностью коэффициентов до 7 знаков после запятой. 
-  - Проанализировать полученные результаты ​и обосновать выбор точности ​''​epsilon''​ вычисления корня. Сопоставить ​полученные ​теоретические результаты с экспериментальными данными.+  - Аналогично ​выполнить построение для ​чебышёвской сетки. 
 +  - Заполнить таблицу для ​каждой ​сетки и сделать выводы:
  
 +^  Значение $ n $                      |  1  |  2  |  3  |  4  |  5  |
 +^  Значение $ M_{n+1} $                |     ​| ​    ​| ​    ​| ​    ​| ​    |
 +^  Значение $ \max|\omega_{n+1}(x)| $  |     ​| ​    ​| ​    ​| ​    ​| ​    |
 +^  Значение $ (n + 1)! $               ​| ​    ​| ​    ​| ​    ​| ​    ​| ​    |
 +^  Значение $ Q_n $                    |     ​| ​    ​| ​    ​| ​    ​| ​    |
 +^  Значение $ \max|R_n(x)| $           ​| ​    ​| ​    ​| ​    ​| ​    ​| ​    |
 +
 +===== Варианты заданий =====
 <note important>​ <note important>​
-Значение параметра $ d $ выбирается каждым студентом самостоятельно и согласовывается ​с преподавателем.+Выполнение ​работ осуществляется ​по индивидуальным вариантам заданий (коэффициентам функции). Номер варианта для каждого ​студента определяется преподавателем.
 </​note>​ </​note>​
- +[[.task2:task2-vars]]
-===== Содержание отчёта ===== +
-  * Цель работы. +
-  * Краткое изложение основных теоретических понятий. +
-  * Постановка задачи с кратким описанием порядка выполнения работы. +
-  * Таблицы с вычислениями при различных вариациях параметров. +
-  * Краткие выводы по полученным результатам. +
-  * Общий вывод по проделанной работе. +
-  * Код программы. +
- +
-===== Тексты программ ===== +
-==== Исследование обусловленности задачи нахождения корня линейного уравнения ==== +
-<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) +
-</​file>​+