Метод половинного деления

Формула для задания:
Надо найти корень уравнения (формула которого я написала) надо найти на отрезке [0,1;5,0] с точностью до
Помогите мне! У меня не вычисляет корень вообще

#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;

double MethodPolDel(double *a, double *b, double *epsilon) // описание функции
{
    double *c = new double; // c - середина отрезка, выделение под памяти под переменную типа double
    int count = 0; // объявление счетчика
    while (abs(*a - *b) >= *epsilon); // до тех пор пока выполняется условие |a - b| >= epsilon
    {
        count++; // счетчик инкрементируется
        *c = (*a + *b) / 2; // расчет середины отрезка [a,b]
        // функция расчета новых границ отрезка с помощью указателей
        if ((5*pow(cos(*a),2) - (2 / (sqrt(*a))) * ((5*pow(cos(*c),2) - (2 / (sqrt(*c)) <= 0))))) // для a и c
        {
            *b = *c; // новый отрезок [a, c]
        }
        else
        {
            *a = *c; // новый отрезок [c, b]
        }
    }
    return *c;
}

int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"");
    int count = 0; // объявление счетчика
    cout << "Используя метод половинного деления, найти корень уравнения.\n" << endl;

    // выделение участков памяти под переменные с помощью указателей
    // [a,b] - отрезок поиска корня уравнения; epsilon - заданная точность
    double *a = new double;
    double *b = new double;
    double *epsilon = new double (0.000005);

    try
{
повтор:
    cout << "Левая граница отрезка, a = ";
    cin >> *a;
    cout << "Правая граница отрезка, b = ";
    cin >> *b;
    cout << "Точность расчетов = ";
    cin >> *epsilon;
    if(!(a > 0))
    {
    cout << "Ошибка при вводе!" << endl;
    cin.clear(); // Очистка потока
    cin.ignore(); // Игнорировние последнего введенного знака 
    goto повтор;
    }
}
    catch(...)
{
    cout << "Ошибка при вводе!" << endl;
}
    double x = MethodPolDel(a, b, epsilon); // вызов функции вычисления корня уравнения
    count++; // счетчик инкрементируется
    cout << "Корень уравнения x = " << x << endl;
    cout.precision(5);
    cout << "Количество итераций: " << count << endl;

    // освобождение выделенной памяти
    delete a;
    delete b;
    delete epsilon;

    system("pause");
    return 0;
}

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

    while (abs(*a - *b) >= *epsilon); // здесь у вас бесконечный цикл.

    // а дальше идет блок, который к оператору while не имеет никакого отношения
    {
        ...
    }

Условие написано с ошибкой. Проверьте скобки:

if ((5*pow(cos(*a),2) - (2 / (sqrt(*a))) * ((5*pow(cos(*c),2) - (2 / (sqrt(*c)) <= 0))))) // для a и c

Вообще «формулу для задания» лучше выделить в отдельную функцию. Будет и аккуратнее и в скобках не запутаетесь.

Зачем вы используете динамическое выделение памяти под одиночные переменные типа double? Это совершенно излишне. К тому же вы не освобождаете память от переменной c в MethodPolDel.

Зачем передача параметров в MethodPolDel сделана через указатели? Хватит и обычной передачи по значению.

Переменная count в функции main и в функции MethodPolDel — это разные переменные. Поэтому «Количество итераций» будет всегда показывать 1.

Оператор goto лучше не использовать. От слова «совсем».
Честно говоря, я вообще не понял зачем там цикл и какой смысл у условия !(a > 0).

Еще у меня сомнение в корректности условия в while (abs(*a - *b) >= *epsilon). Вообще-то там должно быть while (abs(f(c)) >= *epsilon), где f(c) — значение функции в средней точке отрезка.

Корень при ваших условиях равен 2.1223313 (20 итераций).

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

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

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.