Министерство общего и профессионального образования РФ
Московский Авиационный Институт
(Национальный Исследовательский Университет)
Факультет прикладной математики и физики
Кафедра вычислительной математики и программирования
Задание №4
Тема: « Процедуры и функции в качестве параметров»
I семестр
Руководитель
_______________________
(фамилия, инициалы)
___________________________ (подпись) (дата)
Студент _________________
(группа)
_________________________
(фамилия, инициалы)
_________________________
(подпись) (дата)
_________
(оценка)
Москва 2012 г.
Постановка задачи:
Составить программу на языке Си с процедурами решения трансцендентных алгебраических уравнений различными методами (итераций, Ньютона и половинного деления – дихотомии). Нелинейные уравнения оформить как параметры-функции, разрешив относительно неизвестной величины в случае необходимости. Применить каждую процедуру к решению двух уравнений, заданных двумя строками таблицы, начиная с варианта с заданным номером. Если метод неприменим, дать математическое обоснование и графическую иллюстрацию, например, с использованием gnuplot.
Вариант №14.
Метод решения:
Создаем три функции (первая решается с помощью метода дихотомии, вторая с помощью итераций, третья методом Ньютона) и выводим значения получившихся корней.
Предполагается, что функция F(x) достаточно гладкая, монотонная и существует единственный корень уравнения x ∈ [a,b].
Описание методов:
· Метод дихотомии (половинного деления)
Методом половинного деления возможно лишь в том случае, если известно, что на заданном отрезке [a,b] имеется корень, и он является единственным, при этом функция должна иметь на концах отрезка разные знаки: (то есть метод не подходит если функция задает параболу на заданном отрезке). Метод заключается в делении отрезка пополам и его сужении в два раза на каждом шаге итерационного процесса, в зависимости от знака функции в середине отрезка.
Итерационный процесс строится следующим образом: за начальное приближение принимаются границы исходного отрезка . Далее вычисления проводятся по формулам:
o Если
·
·
o Если
·
·
Процесс повторяется до тех пор, пока не будет выполнено условие окончания.
· Метод итераций
Метод заключается в замене исходного уравнения F(x)=0 уравнением вида x=f(x). Достаточное условие сходимости метода итераций: |f’(x)|<1, x∈[a,b].
Начальное приближение корня - это середина исходного отрезка. Далее следующему значению x присваивается значение f от предыдущего значения х. Условием окончания является сравнение разницы текущего значения x и предыдущего с машинным эпсилон.
· Метод Ньютона
Метод Ньютона является частным случаем метода итераций.
В методеследующее значение x (на каждом шаге) получается путем вычитания от предыдущего значения, значения разности исходной функции на производную этой функции. Достаточное условие сходимости метода Ньютона: |F(x)*F’’(x)| < (F’(x))2 .
Функциональное назначение:
Программа предназначена для нахождения решений трансцендентных алгебраических уравнений различными численными методами(итераций, Ньютона и половинного деления-дихотомии). Обрабатываемые данные имеют тип double.
Описание алгоритма:
Создаем функции, отвечающие за определенные компоненты программы (подсчёт основной функции, её производной, вычисление корня методом дихотомии, методом итераций, методом Ньютона). В основной функции выводится полученные корни уравнений различными методами.
Общие сведения о программе:
Операционная система: Ubuntu 10.04 LTS Lucid Lynx
Язык программирования: C
Число строк программы: 64
Программа компилируется и вызывается с помощью g++ cours4.cpp – o cours4.exe
Уравнения по заданию:
· [1, 2] (1)
· [1, 2] (2)
Описание переменных и констант:
Имя | Тип | Назначения |
eps | double | Хранит значение машинного эпсилон |
a | double | Хранит значение начала отрезка функции |
b | double | Хранит значение конца отрезка функции |
c | double | Переменная, принимающая значения на отрезке [a, b] |
с1 | double | Переменная максимально приближенная к с |
Описание подпрограмм:
double Halving(double f(double), double a, double b) – вычисляет корень методом дихотомии
{ double c; while(fabs(b-a)>eps && f(c)!=0) { c=(a+b)/2; if(f(a)*f(c)>0) a=c; else b=c; } return c;} |
double Iteration(double F(double), double a, double b) – вычисляет корень методом итерации
{ double c=(a+b)/2, c1=c+1; while(fabs(c-c1)>eps && F(c)!=c) { c1=c; c=F(c); } return c;} |
double Newton(double f(double), double fp(double), double a, double b) – вычисляет корень методом Ньютона
{ double c=(a+b)/2, c1=c+1; while(fabs(c-c1)>eps && f(c)!=c) { c1=c; c=c-f(c)/fp(c); } return c;} |
double f1(double x) – задается функция f1 для метода дихотомии(1)
{return sin(x/2)/cos(x/2)-cos(x/2)/sin(x/2)+x;}
double F1(double x) - задается функция F1 для метода итерации(1)
{return 2*atan(cos(x/2)/sin(x/2)-x);}
double fp1(double x) – задается производная функции f1(fp1) для метода Ньютона(1)
{return 1/(2*cos(x/2)*cos(x/2))+1/(2*sin(x/2)*sin(x/2))+1;}
Метод дихотомии, метод итерации, метод Ньютона подходит для первого уравнения (1).
Helving root of f1=1.076875
Iteration root of f1=1.076875
Newton root of f1= 1.076874(небольшая погрешность зависит от машинного эпсилон)
double f2(double x) -задается функция f2 для метода дихотомии(2)
{return 0.4+atan(sqrt(x))-x;}
double F2(double x) - задается функция F2 для метода итерации(2)
{return 0.4+atan(sqrt(x));}
double fp2(double x)- – задается производная функции f2(fp2) для метода Ньютона(2)
{return (1/(1+x))*(1/2*(sqrt(x)));}