
лр(1)
.docx
Задание 1: Рассмотрим многочлен
Уилкинсона
=
=
Очевидно, корнями его являются
.
Выполните в MATLAB команду p=poly(1:20),
которая позволяет получить коэффициенты
полинома, корнями которого является
аргумент функции. Наберите roots(p)
и убедитесь, что корни полинома найдены
приближенно. Измените значение, например,
второго коэффициента на малую величину
(составляет
от числа) и снова выполните эту команду
– половина корней стала комплексными
числами! Исходная задача оказалась
неустойчивой к входным данным (их малое
изменение ведет к сильному изменению
решения), в результате чего получился
абсурдный результат.
>> p=poly(1:20);
>> roots(p)'
ans =
20.0003 18.9972 18.0112 16.9711 16.0483 14.9354 14.0653 12.9491 12.0334 10.9840 10.0061 8.9984 8.0003 7.0000 6.0000 5.0000 4.0000 3.0000 2.0000 1.0000
>> p(2)=p(2)-1.0e-7;
>> roots(p)'
ans =
20.7888 + 0.0000i 19.4596 - 1.8743i 19.4596 + 1.8743i 16.7251 - 2.7315i 16.7251 + 2.7315i 14.0113 - 2.4495i 14.0113 + 2.4495i 11.8219 - 1.5994i
11.8219 + 1.5994i 10.1217 - 0.6059i 10.1217 + 0.6059i 8.9253 + 0.0000i 8.0071 + 0.0000i 6.9996 + 0.0000i 6.0000 + 0.0000i 5.0000 + 0.0000i
4.0000 + 0.0000i 3.0000 + 0.0000i 2.0000 + 0.0000i 1.0000 + 0.0000i
Задание 2: Рассмотрим представление
числа в компьютере. Чаще всего в MATLAB
производятся операции над числами с
двойной точностью. Число формата double –
64-разрядное число (8 байт), в котором 1
бит – знаковый, 52 отводятся под мантиссу
и 11 под порядок числа. (
,
- мантисса числа, n - порядок).
Так как в порядке тоже есть знаковый
бит, то множество его значений лежит от
до
.
В командном окне MATLAB наберите 2^1023.
Получилось число с десятичным порядком
+308 (его легко оценить аналитически:
).
Теперь выполните 2^1024 –
получили Inf, т.е. машинную
бесконечность. Команда realmax
как раз и выдает максимальное число,
которое можно представить в MATLAB, команда
realmin – минимальное (по
абсолютной величине).
>> 2^1023
ans =
8.9885e+307
>> 2^1024
ans =
Inf
>> realmax
ans =
1.7977e+308
>> realmin
ans =
2.2251e-308
Задание 3:
Установите формат отображения с плавающей точкой: format long e, выполните sqrt(2)(квадратный корень из 2). Посчитайте число выданных цифр.
>> format long e
>> sqrt(2)
ans =
1.414213562373095e+00
>> %15 цифр
Задание 4: Казалось бы, такая точность представления способна удовлетворить любые нужды исследователя. Однако, необходимо помнить, что, например, перед тем как два числа будут сложены они должны быть приведены к единому порядку, а то, что при сложении выйдет за мантиссу будет отброшено! Поэтому, если сложить 10^8+-10^-7 в мантиссу уложатся 15 десятичных знаков и будет получен верный результат, а если выполнить 10^8+10^-8, то малое число выйдет за разрядную сетку, и получим те же 10^8 (проверьте).
>> 10^8+-10^-7
ans =
9.999999999999990e+07
>> a=10^8+10^-8
a =
1.000000000000000e+08
Вывод: Было получено точное значение переменной, а так как число имеет 15 десятичных знаков, то памяти в мантиссе хватило. В случае переменной b число вышло за объём памяти мантиссы, и произошло округление.
Задание 5: Протестируем компьютер на
погрешность вычислений. Найдем значение
выражения
при
.
С точки зрения аналитической математики
значение этого выражения постоянно и
равно единице для любых n.
Сделайте предположения, при каком
значении n это выражение
перестанет отличаться от единицы, чему
будет равно; напишите программу,
реализующую этот алгоритм с пошаговой
выдачей номера шага, значения
и результата выражения.
будет уменьшаться до тех пор пока не выйдет за разрядную сетку, т е получится
S=[];
for i=0:1:59
eps = 2^-i;
s = (1 + eps - 1)/eps;
S = [S s];
end
disp(S)
Columns 1 through 20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 21 through 40
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
Columns 41 through 60
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0
Задание 6:
Рассмотрим
погрешности численных методов. Построим
алгоритм вычисления интеграла
Интегрируя по частям, находим:
и т.д.
Вычислите
значения интегралов, до n=30.
Заметьте, что подынтегральная функция
на всем отрезке интегрирования
неотрицательна, следовательно, и значение
интеграла – положительное число. Более
того, подынтегральная функция на данном
интервале ограничена функцией
,
т.е. значение интеграла не может превышать
единицы. Посмотрите, как это согласуется
с полученными результатами.
…
>> exp(-1)-1/exp(1)
ans =
5.5511e-017
>> %величина ошибки, каждый член будет отличаться от теоретического на d*n!
I(1)=exp(-1);
for i=2:1:30
I(i)=1-i*I(i-1);
end
disp(I)
0.367879441171442 0.264241117657115 0.207276647028654 0.170893411885384
0.14553294057308 0.12680235656152 0.112383504069363 0.100931967445092
0.0916122929941707 0.0838770700582927 0.0773522293587803 0.0717732476946367
0.0669477799697233 0.0627310804238732 0.0590337936419019 0.0554593017295701
0.0571918705973076 -0.0294536707515363 1.55961974427919 -30.1923948855838
Значения модулей интеграла на логарифмической шкале. Видна ошибка, растущая со скоростью факториала.
код для вывода ошибки
clc
clear all;
d=5.5511e-017; //погрешность
I = exp(-1);
error = d;
for i=1:1:30;
I=1-i*I(i-1);
error = error * i +d;
end
Задание 7: Напишите функцию вычисления значения синуса в виде конечной суммы ряда
(
).
По признаку Лейбница погрешность
вычисления сходящегося знакопеременного
ряда не превышает по абсолютной величине
первого из отброшенных членов. Вычисления
членов ряда проводите до вычисления
члена по модулю не превышающего
.
Вычислите значение синуса в точках
,
убедитесь, что полученные значения с
высокой степенью точности совпадают с
действительным значением синуса в этих
точках. Далее проведите вычисления в
точках
,
выводя результаты по шагам (посчитанный
член и частичную сумму ряда). Полученные
результаты объясняются погрешностями
округления, в реальных программах
значение аргумента приводится к отрезку
.
function s=sinus(x)
u(1)=x;
n=1;
while abs(u(n))>=1e-17
u(n+1)=-u(n)*x^2/((2*(n-1)+2)*(2*(n-1)+3));
n=n+1;
end
s=sum(u);
end
>> sinus(0)
ans =
0
>> sin(0)
ans =
0
>> sinus(pi/3)
ans =
8.660254037844385e-001
>> sin(pi/3)
ans =
8.660254037844386e-001
>> sinus(pi/2)
ans =
1.000000000000000e+000
>> sin(pi/2)
ans =
1
>> sinus(pi)
ans =
2.479031568558660e-016
>> sin(pi)
ans =
1.224646799147353e-016
>> sinus(2*pi)
ans =
4.372518090456442e-016
>> sin(2*pi)
ans =
-2.449293598294706e-016
>> sinus(12*pi)
ans =
-4.227503435861631e-002
>> sin(12*pi)
ans =
-1.469576158976824e-015
>> sinus(13*pi)
ans =
4.282569859949910e-001
>> sin(13*pi)
ans =
-1.960672839908942e-015
>> sinus(14*pi)
ans =
1.184949154441604e+002
>> sin(14*pi)
ans =
-1.714505518806294e-015
Полученные результаты объясняются погрешностями округления, в реальных программах значение аргумента приводится к отрезку [0; π 2 ].
function [G U]=sinus2(x)
u(1)=x; g(1)=x;
n=1;
while abs(u(n))>=1e-17
u(n+1)=-u(n)*x^2/((2*(n-1)+2)*(2*(n-1)+3));
g(n+1)=g(n)+u(n+1);
n=n+1;
end
U=u';% элементы
G=g';% частичные суммы
end
какие бывают ошибки:
1. Ошибка математической модели — ошибка неучтенных параметров физического явления. Например, полет тела, брошенного под углом к горизонту с малыми скоростями можно описывать обычными баллистическими уравнениями без учёта сопротивления воздуха. Как только скорости становятся значительными нужно вводить сопротивление воздуха. Далее следуют: учёт плотности, температуры воздуха, ветра, переменного ускорения свободного падения, вращения Земли и т.д. Построение адекватной математической модели описывается в курсе математического моделирования.
2. Ошибка входных данных — это ошибка измерений параметров физической модели. Во многих физических и технических задачах данная погрешность достигает нескольких процентов. Она приводит к так называемой неустранимой погрешности, которая не управляется математически и, зачастую, приводит к парадоксальным результатам.
3. Ошибка численного метода — связана с тем, что исходные операторы заменяются приближёнными. Например, интеграл – суммой, дифференцирование – конечной разностью, функцию – полиномом, бесконечный ряд – конечной суммой элементов. Погрешность численного метода обычно берут в 2-5 раза меньше неустранимой погрешности. Меньше брать невыгодно из-за увеличения объёма выполняемых вычислений, больше — из-за снижения точности вычислений. Ошибка численного метода управляется математически.
4. Ошибка округления связана с ограниченной разрядной сеткой компьютера, из-за чего, например, бесконечные десятичные дроби представляются в конечном виде.