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