2015-04-01 1 views
0

Я пытаюсь написать код, который просит пользователя дать 5 коэффициентов для полинома 5-й степени, а также просит дать диапазон (два значения), который программы проверяют, есть ли в нем решение или нет (меня попросят найти только одно), и решение должно быть целым числом, а коэффициенты могут быть поплавками.Код для поиска одного корня полинома пятой степени

Я подумываю написать код, который пробегает любое целое число в диапазоне и подставлять его в описание многочлена, чем я определяю, и проверить, равен ли он нулю, но я застрял при принятии решения о том, как сделать петли.

И еще одно, если в интервале, который вводит пользователь, есть несколько корней, тогда мы должны напечатать минимальное значение корней (но у меня нет никакого направления, как это сделать).

Я покажу вам, что я написал до сих пор, и любой вид помощи был бы оценен:

#include <stdio.h> 
#define zero 0.00001 

int main() 
{ 
    double a, b, c , d , e , f , y , beginning_of_range, end_of_range; 

    int x; 

    printf("please enter the coefficients of the polynomial:\n"); 

    scanf("%lf%lf%lf%lf%lf", &a, &b, &c, &d, &e); 

    printf("please enter two values to indicate the beginning and end of range:\n"); 

    scanf("%lf%lf", &beginning_of_range, &end_of_range); 

    while (beginning_of_range > end_of_range) 
    { 
     printf("ERROR: the range you have entered isn't valid, please try again:"); 

     scanf("%lf%lf", &beginning_of_range, &end_of_range); 
    } 

    while (beginning_of_range < end_of_range) 
    { 
     x = beginning_of_range; 

     y = a + b*x + c*x*x + d*x*x*x + e*x*x*x*x + f*x*x*x*x*x; 

     if (y == zero) 
     { 
      printf("the root is:%d", x); 

     } 
     else 
     { 
      x = x+1; 
     } 

     break; 

    } 

    return 0; 
} 
+0

Продолжайте, закончите свой код. Кажется, кто-то прав. Подумайте, что вам нужно только выйти из цикла, если вы найдете решение. Вы знаете политику SO по предоставлению прямого решения домашней работы ... – XapaJIaMnu

+0

im не запрашивает решение, только направление –

+0

'if (y == zero)' это неправильно. Вместо этого вы должны проверить, что абсолютное значение 'y' меньше нуля. Кстати, в вашем коде 'zero' никогда не бывает 0, поэтому лучше переименуйте его. Общим именем для этого типа константы/переменной является «epsilon». Вы должны иметь в виду, что один (почти) никогда не использует '==' с поплавками. – fjardon

ответ

0

Ваша задача в письменном виде очень сомнительна, настолько, что, возможно, существует некорректная интерпретация или неверная коммуникация.

Случайно заданный многочлен с коэффициентами с плавающей запятой будет иметь целые корни с вероятностью, столь близкими к нулю, что это практически невозможно.

Даже с целочисленными коэффициентами для получения целочисленного корня требуется тщательный анализ с обратной обработкой коэффициентов. Просто измените один коэффициент на единицу, и в большинстве случаев все корни будут иррациональными.

Что вы можете сделать в своей структуре - это найти интервалы с изменением знака, чтобы в пределах интервала можно было найти хотя бы один корень, который можно найти, используя один из методов деления пополам, регуляции фальши, иллиноидов, секущих или Мюллеров. Все они производные бесплатно.

Без определения всех корней, а также сложных, довольно сложно гарантировать, что все реальные корни найдены. Таким образом, едва ли можно найти наименьший вещественный корень внутри данного интервала. Там может быть целочисленный интервал с двумя вещественными корнями внутри, так что на границах знак один и тот же. Вам нужно было бы проанализировать знаки всех производных в целых точках, чтобы сделать более надежные догадки в этом случае, см. Правило Декарта и теорему Будана-Фурье.

0

Ваш первый цикл в то время, вероятно, следует, если заявление вместо цикла.

Ваш второй (основной) цикл while никогда не увеличивает начало диапазона. Это, вероятно, вызывает бесконечный цикл для вас.

+0

то как я могу это исправить? –

+0

В конце цикла while добавьте инструкцию, которая увеличивает значение start_of_range. –

+0

begin_of_range ++ –