Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №22 / Lab2 / _Lab2
.cpp#include "math.h"
#include "conio.h"
#include "stdio.h"
// Точность вычислений
#define Epsilon 0.01
#define Delta 0.001
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
// Заданная функция
double Func (double x)
{
return pow(x, 4) - 14*pow(x, 3) + 60*pow(x, 2) - 70*x;
}
// Реализация алгоритма Свенна (сокращение интервала поиска)
void Swann (double *a, double *b)
{
double x1 = 2; // Начальная точка поиска
double h = Func(x1)*0.001; // Начальный шаг
if (Func(x1) < Func(x1+h)) h *= -1; // Выбор направления поиска
while (Func(x1) > Func(x1+h)) // Сокращение интервала с удвоением шага
{
x1 += h;
h *= 2;
}
*a = min(x1+h, x1-h/2);
*b = max(x1+h, x1-h/2);
}
double Dihotomy (double a, double b, int *k)
{
*k = 0;
double x1, x2;
while (b-a > Epsilon)
{
x1 = (a+b-Delta) / 2;
x2 = (a+b+Delta) / 2;
if (Func(x1) < Func(x2))
b = x2;
else
a = x1;
(*k)++;
}
return (a+b) / 2;
}
double Pauell (double a, double b, int *k)
{
double c = b, d;
b = (a+c) / 2;
*k = 0;
do
{
if (!(*k))
d = 0.5 * (Func(a)*(b*b-c*c) + Func(b)*(c*c-a*a) + Func(c)*(a*a-b*b)) /
(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b));
else
{
c = b;
if (Func(d) < Func(b))
b = d;
//printf ("1 = %f, 2 = %f, 3 = %f\n", Func(a)*(b-c), Func(b)*(c-a), Func(c)*(a-b));
d = (a+b)/2 + 0.5 * ((pow(Func(a)-Func(b), 2) * (b-c) * (c-a)) /
(Func(a)*(b-c) + Func(b)*(c-a) + Func(c)*(a-b)));
}
(*k)++;
printf ("\nabs = %f, b = %f, d = %f\n", abs((b-d)/b), b ,d);
getch ();
}
while ((abs((b-d)/b) > Epsilon*Epsilon) || (abs((Func(b)-Func(d))/Func(b)) > Epsilon*Epsilon));
return (b+d) / 2;
}
int main (void)
{
double a, b;
int k1, k2;
Swann(&a, &b);
double min1 = Pauell (a, b, &k1);
printf ("1. Dihotomy:\n Minimum = %f\n Made %d iterations.\n", min1, k1);
//printf ("%f %f", a, b);
getch ();
return 0;
}