Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <stdlib.h>
- #include <iostream>
- #include <windows.h>
- using namespace std;
- double Round(double X, double Delta) {
- if (Delta <= 1E-9) {
- puts("Неверное задание точности округления\n");
- exit(1);
- }
- if (X > 0.0) {
- return Delta * long(X / Delta + 0.5);
- } else {
- return Delta * long(X / Delta - 0.5);
- }
- }
- double F(double x) {
- double s;
- s = asin((2*x)/(1+x*x))-exp(-(x*x));
- return s;
- }
- double BISECT(double Left, double Right, double Eps, int &N, double Delta, bool Err) {
- double E = fabs(Eps) * 2.0;
- double FLeft = F(Left);
- double FRight = F(Right);
- if (Err) //симуляция ошибок (неточности) во входных данных
- {
- FLeft = Round(FLeft, Delta);
- FRight = Round(FRight, Delta);
- }
- double X = 0.5 * (Left + Right);
- double Y;
- if (FLeft * FRight > 0.0) {
- puts("Неверное задание интервала\n");
- exit(1);
- }
- if (Eps <= 0.0) {
- puts("Неверное задание точности\n");
- exit(1);
- }
- if (FLeft == 0.0) {
- return Left;
- }
- if (FRight == 0.0) {
- return Right;
- }
- for (N = 0; Right - Left >= E; N++) {
- X = 0.5 * (Right + Left); // вычисление середины отрезка
- Y = F(X);
- if (Err)
- Y = Round(Y, Delta);
- if (Y == 0.0) {
- return X;
- }
- if (Y * FLeft < 0.0) {
- Right = X;
- } else {
- Left = X;
- FLeft = Y;
- }
- }
- return X;
- }
- int main()
- {
- SetConsoleOutputCP(CP_UTF8);
- double Eps, Left, Right;
- int N;
- int cond = 0;
- cout << "Введите точность Eps" << endl;
- cin >> Eps;
- cout << "Введите координату x левого конца отрезка" << endl;
- cin >> Left;
- cout << "Введите координату x правого конца отрезка" << endl;
- cin >> Right;
- cout << "Введите 1, чтобы найти x: f(x)=0 методом бисекции без моделирования ошибок в исходных данных" << endl;
- cout << "Введите 2, чтобы моделировались ошибки в исходных данных" << endl;
- cin >> cond;
- switch (cond)
- {
- case 1:
- cout << "f(x)=0, x=" << BISECT(Left, Right, Eps, N, 0, false) << endl;
- cout << "Количество итераций: " << N << endl;
- break;
- case 2:
- double Delta;
- cout << "Введите точность округления значения функции для моделирования ошибок" << endl;
- cin >> Delta;
- BISECT(Left, Right, Eps, N, Delta, true);
- cout << "f(x)=0, x=" << BISECT(Left, Right, Eps, N, Delta, true) << endl;
- cout << "Количество итераций: " << N << endl;
- break;
- default:
- cout << "Неверный ввод" << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement