Найти корень уравнения методом деления отрезка пополам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Найти какой нибудь корень уравнения Методом отрезка пополам. Требуюмую точность ввести с клавиатуры.
#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;
}
Вот код, удовлетворяющий условию. Но нужно кое что предусмотреть в нём, на что у меня мыслей не хватило. Нужна помощь! 1) Что если мы при вводе случайно попали в корень.То программа по сути всёравно его делит .Нужно это предусмотреть и вывести корень без многочисленного его деления. 2) На интервале если ввести за место -1000 до 1000 это (от -6 до -1), код не рабочий, ответ не сходится с ответом программы. Почему? Нужно предусмотреть , чтобы код был верный и на этом интервале . Подкиньте идеи, у кого какие есть, потому что у меня они закончились

Решение задачи: «Найти корень уравнения методом деления отрезка пополам»

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;
}

Объяснение кода листинга программы

  1. Объявление функции sign, которая определяет знак числа.
  2. Объявление функции f, которая вычисляет левую часть уравнения.
  3. Объявление функции deleniya, которая реализует метод деления отрезка пополам.
  4. В функции main происходит ввод точности вычислений и интервала для поиска корня.
  5. Вызывается функция deleniya для поиска корня на заданном интервале.
  6. Выводится найденный корень.
  7. Ввод значения для продолжения работы программы (не требуется).
  8. Ввод точности вычислений (не требуется).
  9. Выход из программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5
Похожие ответы