Описание логической структуры (словесное описание алгоритма):
Создаем функции,
отвечающие за определенные компоненты
программы (подсчет машинного Эпсилон,
функции считающие через стандартные
функции языка, считающие производные
фунции и т.д.). Рассматриваем уравнения
вида F(x)=0.
Предполагаем, что функция достаточно
гладкая и монотонная на отрезке([1,2]). На
отрезке ищем приближенное решение с
точностью
,
т.е. такое, что
Также вводим переменные типа double
функции F(x)
= 0 , приведенной к виду f(x)=x.
Описание переменных и констант:
Имя |
Тип |
Назначения |
eps |
double |
Хранит значение машинного Эпсилон |
х |
double |
Аргумент функции |
Описание подпрограмм:
double mod(double x)
Считает модуль данного аргумента
Имя |
Тип |
Вид |
Назначения |
X |
Double |
входной параметр и возвращаемое значение |
Входной параметр и результат вычислений |
double epsylon()
Считает машинное Эпсилон
Имя |
Тип |
Вид |
Назначения |
Eps |
Double |
входной параметр и возвращаемое значение |
Входной параметр и результат вычислений |
double F(double x)
Считает значение функции с помощью встроенных функций языка программирования.
Имя |
Тип |
Вид |
Назначения |
X |
Double |
входной параметр возвращаемое значение 0,1x^2-x*ln(x) |
Входной параметр результата вычислений 0,1x^2-x*ln(x) |
double f(double x)
Считает значение производной функции с помощью встроенных функций языка программирования.
Имя |
Тип |
Вид |
Назначения |
X |
Double |
входной параметр возвращаемое значение 0.2*x-ln(x)-1 |
Входной параметр результата вычислений 0.2*x-ln(x)-1 |
double ff(double x)
Считает значение второй производной функции с помощью встроенных функций языка программирования.
Имя |
Тип |
Вид |
Назначения |
X |
Double |
входной параметр возвращаемое значение 0.2-1/x |
Входной параметр результата вычислений 0.2-1/x |
double fp(double x)
Считает значение функции полученной преобразованиями функции F(x)=0 к виду x=f(x) с помощью встроенных функций языка программирования.
Имя |
Тип |
Вид |
Назначения |
X |
Double |
входной параметр возвращаемое значение 2-0.2*x+log(x) |
Входной параметр результата вычислений 2-0.2*x+log(x) |
double dichotomy(double x)
Использование метода дихотомии.
Имя |
Тип |
Назначения |
X |
Double |
Происходит деление отрезка на 2 до тех пор, пока F(x)*F(A)>0. |
double itertions (double x)
Использование метода итераций.
Имя |
Тип |
Назначения |
X |
Double |
Заменяет функцию F(x)=0 функцией f(x)=x. Сравниваются значения разности x-ов с |
double Newton (double x)
Использование метода дихотомии.
Имя |
Тип |
Назначения |
X |
Double |
Происходит приближение значения x по формуле x^(k+1)=x^k-F(x^k)/F’(x^k). пока |x^(k+1)-x^k|>eps и F’(x^k) не равно x^k. |
Входные данные:
Заданны два уравнения и промежутки монотонности, на которых ищем корень.
Выходные данные:
Выводится вариант задания потом два ответа, полученных в резуьтате нахождения корней уравнений 0,1x^2-x*ln(x) всеми выше названными методами.
Тестовые данные:
Вместо тестовых данных, используем реальные значение при аргументе 1,1183.
Текст программы:
#include <conio.h>
#include <stdio.h>
#include <math.h>
double F(double x)
{
return (0.1*pow(x,2)-x*log(x));
}
double f(double x)
{
return (0.2*x-log(x)-1);
}
double fp(double x)
{
return (2-0.2*x+log(x));
}
double ff(double x)
{
return (0.2-1/x);
}
double mod(double x)
{
if(x>=0) return x;
else return -x;
}
double epsylon()
{
double eps=1.0;
while (eps+1>1)
{
eps/=2;
}
return eps;
}
double dichotomy(double A, double B, double F(double x))
{
int n=0;
double x, eps=epsylon();
while (n<57)
{
x=(A+B)/2;
if((F(x)*F(A))>0)
A=x;
if((F(x)*F(B))>0)
B=x;
n++;
}
return x;
}
double itertions(double A, double B, double fp(double x))
{
double x=(A+B)/2;
double xprev, eps=epsylon();
while (mod(x-xprev)>eps)
{
xprev=x;
x=f(xprev);
}
return x;
}
double Newton (double F (double), double f(double), double A, double B)
{
double C=(A+B)/2, C1= C+1;
while (fabs (C-C1)>epsylon() && f(C)!=C)
{C1=C; C=C-F(C)/f(C);}
return C;
}
int main()
{
double A=1.0;
double B=2.0;
printf("Variant 20 \n");
printf("Metod Dichotomii %.20f\n", dichotomy(A, B, F));
if(mod(fp(A))<1 && mod(fp(B)<1))
{
printf("Metod Iteracii %.20f\n", itertions(A, B, fp));
}
else printf("Metod Iteracii ne primenim\n");
if(mod(F(A)*ff(A))<pow(f(A),2) && mod(F(B)*ff(B))<pow(f(B),2))
{
printf("Metod Newton %.20f\n", Newton (F,f,A,B));
}
else printf("Metod Newton ne primenim\n");
getch();
}
