- •Математические модели и численные методы
- •Структура погрешности при решении задачи на эвм
- •Решение уравнений с одной переменной Постановка задачи
- •Отделение корней
- •I. Графический способ отделения корней
- •II. Отделения корней программным способом.
- •Уточнение корней
- •Метод половинного деления
- •Метод хорд
- •Метод касательных
- •Метод простой итерации
- •Оценка погрешности метода итераций
- •Преобразование к итерационному виду
- •Решение системы линейных алгебраических Постановка задачи
- •Метод Гаусса
- •Метод простой итерации
- •Решение слу методом Зейделя
- •Интерполирование функций Постановка задачи
- •Интерполяционный многочлен Лагранжа
- •Интерполяционный многочлен Ньютона для равноотстоящих узлов
- •Первая интерполяционная формула Ньютона
- •Вторая интерполяционная формула Ньютона
- •Численное дифференцирование
- •Вычисление производной по определению
- •Вычисление производной на основе интерполяционного многочлена Лагранжа
II. Отделения корней программным способом.
Пусть имеется уравнение F(x)=0, причем все корни находятся на отрезке [a,b]. Будем вычислять все значения функции y=F(x), начиная с точки x=a, двигаясь вправо шагом h. Если функция на отрезке длины h меняет знак (т.е. F(a)F(b)<0) и монотонна, можно считать, что на этом отрезке ровно 1 корень.
П равильность нахождения отрезков, содержащих один корень, зависит от характера функции y=F(x) и от величины шага h. При выборе шага должна соблюдаться «золотая середина», т.к. шаг h должен быть с одной стороны достаточно малым, чтобы не произошло потери корней, а с другой стороны не настолько маленьким, чтобы число отрезков не было слишком большим.
Программа отделения корней:
program otd_korn;
var x1,x2,a,b,h:real;
function f(x: real):real;
begin {записать, функцию в виде f:=[математическое выражение]} f:=x*x*x-x+4;
end;
begin
write('Введите левую границу отрезка - a: ');readln(a);
write('Введите правую границу отрезка - b: ');readln(b);
write('Введите шаг - h:'); readln(h);
x1:=a; x2:=x1+h;
while x2<b do
begin
if f(x1)*f(x2)<0
then writeln('[ ',x1:6:2,' , ',x2:6:2,' ]');
x1:=x2; x2:=x1+h;
end;
readln;
end.
Блок-схема отделения корней: |
Результаты выполнения программы: |
|
Введите левую границу отрезка - a: -100 Введите правую границу отрезка - b: 100 Введите шаг - h:1 [ -2.00 , -1.00 ]
|
Уточнение корней
Уточнение корней может осуществляться различными методами.
Метод половинного деления
Пусть 1) функция y=F(x) определена и непрерывна на отрезке [a,b].
2) F(a)F(b)<0
Требуется найти корень на отрезке с точностью ε.
Разделим отрезок [a,b] пополам точкой . Если , то возможны два случая: 1) F(x) меняет знак на отрезке [a; c];
2) F(x) меняет знак на отрезке [c; b].
Выбираем тот отрезок, на котором функция меняет знак. Если F(x) меняет знак на отрезке [a; c], то b:=c; если F(x) меняет знак на отрезке [c; b], то a:=c.
Условие окончания счета: .
Корень уравнения: . Погрешность метода: .
Рассмотрим положительные и отрицательные стороны метода половинного деления.
«Плюсы»: |
«Минусы»: |
|
|
Программа уточнения корней методом половинного деления:
program pol_del;
var a,b,c,e,x,dX: real;
N:integer;
function f(x: real):real;
begin
{записать, функцию в виде f:=[математическое выражение]}
f:=x*x*x-x+4;
end;
begin
write('Введите левую границу отрезка - a: ');readln(a);
write('Введите правую границу отрезка - b: ');readln(b);
write('Введите требуемую погрешность - e:'); readln(e);
N:=0;
repeat N:=N+1; c:=(a+b)/2;
if f(a)*f(c)<0 then b:=c else a:=c;
until b-a<e;
x:=(a+b)/2; dX:=(b-a)/2;
writeln('Приближенное значение корня - Х = ',x);
writeln('Ошибка не превышает dX = ',dX);
writeln('Число итераций - N = ',N);
readln
end.
Блок-схема уточнения корней методом половинного деления: |
Результаты выполнения программы: |
|
Введите левую границу отрезка - a: -2 Введите правую границу отрезка - b: -1 Введите требуемую погрешность - e:.0001 Приближенное значение корня - Х = -1.7962951660E+00 Ошибка не превышает dX = 3.0517578125E-05 Число итераций - N = 14
|