Найти корень уравнения методом деления отрезка пополам - C (СИ)
Формулировка задачи:
Найти какой нибудь корень уравнения
Методом отрезка пополам.
Требуюмую точность ввести с клавиатуры.
Вот код, удовлетворяющий условию.
Но нужно кое что предусмотреть в нём, на что у меня мыслей не хватило. Нужна помощь!
1) Что если мы при вводе случайно попали в корень.То программа по сути всёравно его делит .Нужно это предусмотреть и вывести корень без многочисленного его деления.
2) На интервале если ввести за место -1000 до 1000 это (от -6 до -1), код не рабочий, ответ не сходится с ответом программы. Почему? Нужно предусмотреть , чтобы код был верный и на этом интервале .
Подкиньте идеи, у кого какие есть, потому что у меня они закончились
Листинг программы
- #include <stdio.h>
- #include <math.h>
- //Левая чать уравнения f(x)=0
- double f(double x)
- {
- return -2.4*x*x*x-28.512*x*x-40.6272*x+44.928;
- }
- //Метод деления отрезка пополам
- double deleniya(double a,double b,double e)
- {
- double c;
- while(fabs(b-a)>e) //продолжать поиск корня пока не достинута заданная точность
- {
- c=(a+b)/2; //делим промежуток пополам
- if(f(c)>=0) //в зависимости от знака
- a=c; //двигаемся к одному
- else
- b=c; //или другому концу промежутка
- }
- return (a+b)/2.0; //Вернуть найденный корень уравнения
- }
- int main()
- {
- int k;
- double e,x;
- printf("-2.4x^3-28.512x^2-40.6272x+44.928=0\n");
- printf("Tochnost(0.1 ... 0.0000001): ");
- scanf("%lf",&e); //Ввод точности вычисления
- x=deleniya(-1000,1000,e); //Поиск корня на интервале (-1000;1000) c заданной точностью
- printf("x = %lf\n",x); //вывод результата
- scanf("%d",&k); //Задержка перед закрытием
- return 0;
- }
Решение задачи: «Найти корень уравнения методом деления отрезка пополам»
textual
Листинг программы
- п»ї/*Найти какой нибудь корень уравнения
- -2.4x^3-28.512x^2-40.6272x+44.928=0.
- Методом отрезка пополам.
- Требуюмую точность ввести с клавиатуры. */
- #include <stdio.h>
- #include <math.h>
- int sign(double x)
- {
- double rez;
- if (x < 0) rez=-1;
- else if (x==0) rez=0;
- else rez=1;// вернет
- return rez;
- }
- //Левая чать уравнения f(x)=0
- double f(double x)
- {
- //return -2.4*x*x*x-28.512*x*x-40.6272*x+44.928;
- return pow(x,4)-4.1*pow(x,3)+x*x-5.1*x-4.1;
- }
- //Метод деления отрезка пополам
- double deleniya(double a,double b,double e)
- {
- double x0;
- while(fabs(b-a)>e) { //продолжать поиск корня пока не достинута заданная точность
- x0=(a+b)/2;
- printf ("\n c=%lf, f(c)=%lf", x0, f(x0));//делим промежуток пополам
- if(sign(f(a))!=sign(f(x0))) //в зависимости от знака
- b=x0; //двигаемся к одному
- else
- a=x0; //или другому концу промежутка
- }
- return (a+b)/2.0; //Вернуть найденный корень уравнения*/
- }
- int main()
- {
- double e,x,lx,rx;
- printf("-2.4x^3-28.512x^2-40.6272x+44.928=0\n"); // поменять под себя
- printf("Tochnost(0.1 ... 0.0000001): "); // поменять под себя
- scanf("%lf",&e); //Ввод точности вычисления
- printf("Vvedite a, b. ");
- scanf("%lf %lf", &lx, &rx);
- x=deleniya(lx,rx,e); //Поиск корня на интервале (-1000;1000) c заданной точностью
- printf("\nx = %lf\n",x); //вывод результата
- // printf("Prodolgim? y or n"); // НЕ НУЖНО, ИЛИ В ЦИКЛ
- scanf("%lf",&e); //Задержка перед закрытием
- return 0;
- }
Объяснение кода листинга программы
- Объявление функции
sign
, которая определяет знак числа. - Объявление функции
f
, которая вычисляет левую часть уравнения. - Объявление функции
deleniya
, которая реализует метод деления отрезка пополам. - В функции
main
происходит ввод точности вычислений и интервала для поиска корня. - Вызывается функция
deleniya
для поиска корня на заданном интервале. - Выводится найденный корень.
- Ввод значения для продолжения работы программы (не требуется).
- Ввод точности вычислений (не требуется).
- Выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д