класс — C ++ Алгоритм деления пополам для квадратного уравнения

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

#include "assign4.h"#include <iostream>

using namespace std;

int main(int argc, char * argv[]){
solution s;
double root;

cout << "Enter interval endpoints: ";
cin >> s.xLeft >> s.xRight;

cout << "Enter tolerance: ";
cin >> s.epsilon;

root = s.bisect (s.xLeft, s.xRight, s.epsilon, &solution::f, s.error);

if (!(s.error))
cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << "\n";
else {
cout << "The solution of a quadratic equation with coefficients: " << endl;
//      cout << "a = " << a << ", b = " << b << ", c = " << c << endl;
cout << "has not been found." << endl;
}
return 0;
}

////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////////

#include "assign4.h"#include <iostream>
#include <math.h>

using namespace std;

double solution::bisect (double xLeft, double xRight, double epsilon, double (solution::*f)(double), bool& error) {
double xMid;
double fLeft, fRight;
double fMid;

fLeft = (this->*f)(xLeft);
fRight = (this->*f)(xRight);

error = (fLeft * fRight) < 0;
if (error)
return -999.0;

for (double i = 0; i < 20; i++) {
xMid = (xLeft + (xLeft + 1.0)) / 2.0;
fMid = (this->*f)(xMid);

if (fLeft * fMid > 0.0) {
xLeft = xMid + 0.5;
xRight = xLeft + 1.0;
fLeft = fMid;
}
else if (fLeft * fMid < 0.0){
xRight = xMid;
fRight = fMid;
}
else {
return xMid;
}

cout << "New Interval is [" << xLeft << ", " << xRight << "]" << endl;
}

return (xLeft + xRight) / 2.0;
}

double solution::f (double x) {
return ((1 * pow(x,2.0)) + (5 * x) + 2);
}

////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////////

#ifndef ASSIGN4_H
#define ASSIGN4_H

class solution {

public:
double xLeft, xRight;
double epsilon;
bool error;

double bisect(double, double, double, double (solution::*f)(double), bool&);
double f(double);
};
#endif // ASSIGN4_H

////////////////////////////////////////////////// ////////////////////////////////////////////////// /////////////////////////////////////////////

Моя цель с этим заданием — найти любые корни, если они существуют. Моя проблема в том, что каждый найденный мной пример деления пополам говорит только о том, как найти один корень одновременно. Интервал, который я должен использовать, равен [-10.0, 10.0], и в конечном итоге я собираюсь получить коэффициенты уравнения, переданного через массив, инкапсулированный в структуру, но сейчас я жестко закодировал коэффициенты.

Поэтому моя проблема в том, что я могу в настоящее время получить 0,2 из первого корня для уравнения, которое я жестко закодировал (x ^ 2 + 5x + 2), но я не уверен, как пройти мимо этого корня и продолжать поиск другого корня до конец моего интервала. Я также не уверен в том, как точно попасть в рут и не быть незначительным.

Приносим свои извинения за стену текста и любую помощь! 🙂

0

Решение

Вы можете ввести интервал так, чтобы он включал оба корня. Тогда позвони bisect дважды — один раз для нижнего корня и один раз для высшего корня.

 int main(int argc, char * argv[]){
solution s;
double root;

cout << "Enter interval endpoints: ";
cin >> s.xLeft >> s.xRight;

cout << "Enter tolerance: ";
cin >> s.epsilon;

double xMid = 0.5*(s.xLeft + s.xRight);
root = s.bisect (s.xLeft, xMid, s.epsilon, &solution::f, s.error);
if (!(s.error))
cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << endl;
else
{
cout << "The solution of a quadratic equation with coefficients: " << endl;
cout << "has not been found." << endl;
}

root = s.bisect (xMid, s.xRight, s.epsilon, &solution::f, s.error);
if (!(s.error))
cout << "Root found at " << root << "\nValue of f(x) at root is: " << s.f(root) << endl;
else
{
cout << "The solution of a quadratic equation with coefficients: " << endl;
cout << "has not been found." << endl;
}return 0;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector