Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #include <clocale>
- double Delta = 0.0000001;
- double Round(double X, double delta)
- {
- if(delta <= 1E-9)
- {
- //std::wcout << L"Неверное задание точности округления\n";
- std::cout << "round";
- return 0;
- }
- if(X > 0.0)
- return delta * long((X / delta) + 1.0 / 2);
- else
- return delta * long((X / delta) - 1.0 / 2);
- }
- double F(double x)
- {
- return sinh(x) - x + 1;
- }
- 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");
- std::cout << "F*L";
- exit(1);
- }
- if (Eps <= 0.0) {
- //puts("Неверное задание точности\n");
- std::cout << "EPS";
- 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); // результаты и скорость сходимости
- //Y = Round(F(X), Delta); // чувствительность метода к ошибкам
- 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 Round(X, Eps);
- }
- int main() {
- setlocale(LC_ALL, "Russian");
- int N;
- double eps = 0.1;
- double res;
- const double x = -1.7291169;
- for(int i = 0; i < 7; i++)
- {
- res = HORDA(-2, -1.8, eps, N);
- printf("F(x) = 0 => x = %.7f\n"
- "x* - x = %.7f\n"
- "N(EPS) = %u(%.7f)\n\n",
- res, fabs(res - x), N, eps);
- eps /= 10;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement