Метод деления отрезка пополам (работа с массивами)

Тема в разделе "C/C++/C#", создана пользователем Fazer77777, 21 фев 2015.

  1. Fazer77777

    Fazer77777 New Member

    Регистрация:
    30 июн 2012
    Сообщения:
    4
    Симпатии:
    0
    Здравствуйте!

    Задача такая:
    Дан поленом y(x) = 2{x}^{3} + 3{x}^{2} - 6x + 6. Нахожу его его производную y(x) = 6{x}^{2} + 6x - 6 (вручную).
    1. Далее нужно подставить концы отрезка [a;b], a = 6, b = - 6 в производную на место x и посчитать.
    Затем с некоторым шагом i = 1 находить производную пока не выйдет за пределы отрезка (за b), т.е. x = a+i. Я думаю сохранять все точки в 1-й массив.
    2. Находим 2 ближайшие друг к другу точки с разным знаком, то нужно запомнить их - это концы нового отрезка [c;d]. Тут я думаю извлечь из массива эти нужные точки и сохранить во 2-ой массив, но как это сделать не знаю. Не знаю как пробежаться по всем элементам массива и вытащить нужные значения (точки).
    3. С новым отрезком повторить шаг 1 и 2 пока все точки не будут менять знак, все будут одинакового знака, значит найден минимальный нужный отрезок.
    4. Воспользоваться методом деления отрезка пополам.
    Найти производную на концах полученного отрезка, например получился 3-й по счёту, [e;f].
    5. Найти среднюю точку xcp = (e+f)/2. Находим производную в этой точке y'(xcp) и если y'(xcp)>0, то рассматриваем отрезок [e; xcp]. Если y'(xcp)<0, то рассматриваем отрезок [xcp; f].
    6. С новым отрезком повторить шаг 4 и 5 пока отрезок не уменьшиться (пока производная на концах отрезка в шаге 4 имеет разные знаки).

    Пытаюсь так:

    Код (C++):
    #include "stdafx.h"
    #include <iostream>
    #include <math.h>
    using namespace std;
    int main() {
    int yDif2, s=2, b = 102, mas1[16], mas2[16], c, d;
    double yDif1, a=-6;
       for (int i = 2; i < 10; i++) { //границы индексов здесь интуитивно поставил,
    //т.е. первые же i=0,1 приводили к yDif1>b,
    //b - здесь не значение отрезка, а значение производной yDif1 в b.
      yDif1 = 6*pow((a+i), s) + 6*(a+i) - 6;
      if (yDif1>b) { //чтобы производная не превышала значение производной в b
      i=10;
      }
    mas1 = yDif1; // Сохраняю все точки в 1 массив,
    //далее не знаю как пробежаться по нему и сохранить во 2-й массив нужные значения (точки) и т.д.
    cout <<"yDif1 = "<< yDif1 <<endl;
    cout << "Value of element is mas1 = " << mas1 << endl;
    }
    system ("pause");
       return 0;
    }



    Помогите с задачкой:)
     
    #1 Fazer77777, 21 фев 2015
    Последнее редактирование модератором: 21 фев 2015
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Цель какая?
    Первым шагом ты нашел точки перегиба, но потом используешь только одну из них.

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

    Для начала, перестань все мешать в кучу.

    Что значит ближайшие? - у тебя все точки находятся друг от друга на одном расстоянии, ты же в первом пункте задал "некоторый шаг"
     
Загрузка...

Поделиться этой страницей