Материал: Larin_Anton_8383_cm_21_5

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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;

}

Источник: https://studfile.net/preview/15918987/