Найти корень уравнения методом деления отрезка пополам - 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
для поиска корня на заданном интервале. - Выводится найденный корень.
- Ввод значения для продолжения работы программы (не требуется).
- Ввод точности вычислений (не требуется).
- Выход из программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д