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

Fazer77777

New member
30.06.2012
4
0
#1
Здравствуйте!

Задача такая:
Дан поленом 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;
}



Помогите с задачкой:)
 
Последнее редактирование модератором:
R

rrrFer

#2
Цель какая?
Первым шагом ты нашел точки перегиба, но потом используешь только одну из них.

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

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

Находим 2 ближайшие друг к другу точки с разным знаком, то нужно запомнить их - это концы нового отрезка [c;d].
Что значит ближайшие? - у тебя все точки находятся друг от друга на одном расстоянии, ты же в первом пункте задал "некоторый шаг"