Поиск корней с использованием секущей функции в C ++

0

Я борюсь с программой для класса, который я принимаю. Я должен найти корни функции, используя секущий метод в C++. Я все это написал, и я нашел второй нуль в 0,146; однако корень, который ищет мой профессор, - 0,064. Я пробовал все, что могу, но не могу понять, как сделать вывод 0.064. Он сказал нам, чтобы вставить заголовочный файл, в котором есть функция, вот заголовочный файл:

    #define FX0 pow(x0, 3) - 0.165*pow(x0, 2) + 3.993E-4
    #define FX1 pow(x1, 3) - 0.165*pow(x1, 2) + 3.993E-4

и вот код:

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    #include "Secant.h"
    #include "Keyboard.h"
    using namespace std;


    int main()
    {
    //Define Variables
    float x0,x1,x2,tolerance,maxIterations,count,FX;
    count = 0;
    x0 = 0.02;
    x1 = 0.05;
    tolerance = .000001;
    maxIterations = 100;
    FX = pow(x0, 3) - 0.165*pow(x0, 2) + 3.993E-4;

    //Loop statement that runs until a Zero is found
    while(fabs(FX0-FX1)>tolerance && count < maxIterations && fabs(FX)>tolerance)
    {
    x2=x1-(FX1*((x0-x1)/(FX0-FX1)));
         FX = pow(x2, 3) - 0.165*pow(x2, 2) + 3.993E-4;

    x0=x1;
    x1=x2;

    count++;
    }


    //Display the zero
    if (fabs(FX)<tolerance)      
    cout << "The zero is at x = " << setprecision(4) << x2;
    //Or Report that no zero was found
    else
    cout << "No zeroes were found within the given function.";

    return 0;
    }
Теги:

1 ответ

3

Когда вы используете #define, компилятор просто заменяет ваш макрос FX1 его текстовым значением (в данном случае). Так

 FX1*((x0-x1)/(FX0-FX1))

становится

 pow(x1, 3) - 0.165*pow(x1, 2) + 3.993E-4*((x0-x1)/(pow(x0, 3) - 0.165*pow(x0, 2) + 3.993E-4-pow(x1, 3) - 0.165*pow(x1, 2) + 3.993E-4))

что приводит к проблемам с скобками в неправильном месте, вместо этого оно умножает 3.9993E-4.

Попробуйте положить скобки вокруг своих определений или, возможно, изменить их на функции.

#define FX0 (pow(x0, 3) - 0.165*pow(x0, 2) + 3.993E-4)
  • 2
    Черт возьми, это сработало. Вы не представляете, как долго я боролся с этой программой. Я не могу отблагодарить вас достаточно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню