Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- int main(int argc, const char * argv[]) {
- bool isIncorrect;
- float a;
- float b;
- float tochnost;
- int kolvoCifr = 0; // Кол-во цифр после запятой
- float middlePoint = 0;
- // x и функции от x:
- double xLeft;
- double fXLeft;
- double xRight;
- double fXRight;
- double f1X; //производная для функции в определённой точке в прошлой итерации
- float koren1 = 0;
- float koren2 = 0;
- int kolvoKorney;
- bool fAIsPositive; //положительна ли функция при x=a
- bool fBIsPositive; //положительна ли функция при x=b
- bool answerIsNotReady = true;
- int i;
- std::cout << "Задание: уточните корень уравнения e^x - 10x = 0 на отрезке [a, b] комбинированным методом хард и касательных\n";
- std::cout << "\nВведите число A (от -10 до 10): ";
- do {
- isIncorrect = false;
- std::cin >> a;
- if (abs(a) > 10) {
- std::cout << "Число A должно быть от -10 до 10. Введите число из этого промежутка: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- std::cout << "Введите число B (до 10): ";
- do {
- isIncorrect = false;
- std::cin >> b;
- if (b <= a) {
- std::cout << "Число B должно быть больше A. Введите число больше " << a << ", но до 10: ";
- isIncorrect = true;
- }
- if (!isIncorrect and b > 10) {
- std::cout << "Число B не может быть больше 10. Пожалуйста, введите число до 10: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- std::cout << "Введите требуемое количество цифр после запятой (от 1 до 6): ";
- do {
- isIncorrect = false;
- std::cin >> kolvoCifr;
- if (kolvoCifr < 1 or kolvoCifr > 6) {
- std::cout << "Введите количество цифр после запятой от 1 до 6: ";
- isIncorrect = true;
- }
- } while (isIncorrect);
- tochnost = pow(10, -kolvoCifr);
- fAIsPositive = exp(a) - 10 * a > 0;
- fBIsPositive = exp(b) - 10 * b > 0;
- // определение количества корней и, если корней два, нахождение икс между корнями, чтобы f(middlePoint) было с другим знаком, чем f(xLeft) и f(xRight).
- if (fAIsPositive == fBIsPositive) {
- if (fAIsPositive) {
- kolvoKorney = 2;
- // Нахождение такой точки xMiddle, что f(xMiddle) < 0, чтобы у нас была точка на графике функции с отличным от f(a) и f(b) знаком.
- middlePoint = a;
- do {
- middlePoint++;
- if (middlePoint > b - 1) {
- kolvoKorney = 0;
- answerIsNotReady = false;
- }
- } while ((answerIsNotReady) and (exp(middlePoint) - 10 * middlePoint > 0));
- } else {
- kolvoKorney = 0;
- answerIsNotReady = false;
- }
- } else {
- kolvoKorney = 1;
- }
- // нахождение корней, если они есть
- if (answerIsNotReady) {
- for (i = 0; i < kolvoKorney; i++) {
- if (i == 0) {
- xLeft = a;
- if (kolvoKorney == 1) {
- xRight = b;
- } else {
- xRight = middlePoint;
- }
- } else {
- xLeft = middlePoint;
- xRight = b;
- }
- // У данной функции две ветви, направленные вверх.
- // Чтобы не писать код отдельно для двух ветвей, можно просто мысленно поменять их местами.
- // То есть, если мы находимся на левой ветви функции, то надо поменять местами все переменные ...Left и ...Right.
- // Это произойдёт автоматически, если поменять местами 2 переменные: xRight и xLeft.
- fXRight = exp(xRight) - 10 * xRight; // если fXRight < 0, то мы находимся на левой ветви функции.
- if (fXRight < 0) {
- xRight += xLeft; // эти 3 строки свапают 2 переменные
- xLeft = xRight - xLeft;
- xRight -= xLeft;
- }
- // xRight > xLeft ? - это опять же проверка на то, на какой мы ветви функции
- while (xRight > xLeft ? xRight - xLeft > tochnost : xLeft - xRight > tochnost) {
- fXRight = exp(xRight) - 10 * xRight;
- fXLeft = exp(xLeft) - 10 * xLeft;
- f1X = ((exp(xRight + tochnost*tochnost) - 10 * (xRight + tochnost*tochnost)) - fXRight) / (tochnost*tochnost);
- xLeft = (xRight * fXLeft - xLeft * fXRight)/ (fXLeft - fXRight);
- xRight = xRight - fXRight / f1X;
- }
- if (i == 0) {
- koren1 = (xRight + xLeft) / 2;
- } else {
- koren2 = (xRight + xLeft) / 2;
- }
- }
- }
- if (kolvoKorney < 1) {
- std::cout << "Нет корней\n";
- } else if (kolvoKorney > 1) {
- printf("Корни: %.*f и %.*f \n", kolvoCifr, koren1, kolvoCifr, koren2);
- } else {
- printf("Корень: %.*f\n", kolvoCifr, koren1);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment