if (Y * FLeft < 0.0) {
Right = X;
} else {
Left = X;
FLeft = Y;
}
}
return X;
}
#ifdef __ITER
double ITER(double X0, double Eps, int &N) {
extern double PHI(double);
if (Eps <= 0.0) {
puts("Неверное задание точности\n");
exit(1);
}
double X1 = PHI(X0);
double X2 = PHI(X1);
for (N = 2;
(X1 - X2) * (X1 - X2) > fabs((2 * X1 - X0 - X2) * Eps);
N++) {
X0 = X1;
X1 = X2;
X2 = PHI(X1);
}
return X2;
}
#endif
#ifdef __NEWTON
double NEWTON(double X, double Eps, int &N) {
extern double F1(double);
double Y, Y1, DX, Eps0;
N = 0;
double m1 = 1.154884, // наименьшее значение модуля 1-ой производной
M2 = 7.268115; // наибольшее значение модуля 2-ой производной
Eps0 = sqrt(2 * m1 * Eps / M2);
do {
Y = F(X);
if (Y == 0.0) {
return X;
}
Y1 = F1(X);
if (Y1 == 0.0) {
puts("Производная обратилась в ноль\n");
exit(1);
}
DX = Y / Y1;
X -= DX;
N++;
} while (fabs(DX) > Eps0);
return X;
}#endif
double HORDA(double Left, double Right, double Eps, int &N) {
double FLeft = F(Left);
double FRight = F(Right);
double X, Y;
if (FLeft * FRight > 0.0) {
puts("Неверное задание интервала\n");
exit(1);
}
if (Eps <= 0.0) {
puts("Неверное задание точности\n");
exit(1);
}
N = 0;
if (FLeft == 0.0) {
return Left;
}
if (FRight == 0.0) {
return Right;
}
do {
X = Left - (Right - Left) * FLeft / (FRight - FLeft);
Y = F(X);
if (Y == 0.0) {
return X;
}
if (Y * FLeft < 0.0) {
Right = X;
FRight = Y;
} else {
Left = X;
FLeft = Y;
}
N++;
} while (fabs(Y) >= Eps);
return X;
}
#define FF(x) ( (M_PI * pow(x, M_PI + 7) + 2 * M_PI*pow(x, M_PI + 3) + M_PI * pow(x, M_PI - 1) + 4 * pow(x, 3)) / (pow(x, 8) + 2 * pow(x, 4) + 1) )
int main()
{
int k_B,k_H,k_N;
long int s;
float a1, b1, eps1, delta1;
double a, b, eps, x_B, x_H, x_N;
a = 0.5;
b = 1.25;
double x = 0.867086;
printf("eps\t\tdelta\t\ta\t\tb\t\tx_B\t\tx_H\t\tx_N\t\t\tk_B\tk_H\tk_N\tDx\t\tc\n");
for (delta = 0.1; delta >= 0.000001; delta /= 10)
{
for (eps = 0.1; eps >= 0.000001; eps /= 10)
{
x_B = BISECT(a, b, eps, k_B);
x_H = HORDA(a, b, eps, k_H);
x_N = NEWTON(b, eps, k_N);
printf("%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%lf\t%d\t%d\t%d\t%lf\t%d\n", eps, delta, a, b, x_B, x_H, x_N, k_B, k_H, k_N, abs(x-x_N), eps>=abs(x - x_N));
}
}
return 0;
}