• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы Fazer77777
  • Дата начала
F

Fazer77777

Здравствуйте!

Задача такая:
Дан поленом 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 ближайшие друг к другу точки с разным знаком, то нужно запомнить их - это концы нового отрезка [c;d].
Что значит ближайшие? - у тебя все точки находятся друг от друга на одном расстоянии, ты же в первом пункте задал "некоторый шаг"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!