Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2017, 20:09   #1
Denis1221
Новичок
Джуниор
 
Регистрация: 14.12.2017
Сообщений: 1
По умолчанию Метод Пауэла

перевел с паскаля код
Код:
#include <iostream>
#include <math.h>
using namespace std;

double f(double x){
return 2*x*x-exp(x);
}

double Find(double xs, double h, double eps1, double eps2, int max_step)
{
double x[3];
double f_x[3];
int k;
int i_min =0, i_max=0;
double xn, f_xn, a1, a2;

   x[0] = xs; 
   x[1] = xs + h;

   if (f(x[0]) > f(x[1])) {
     x[2] = xs + 2 * h;
}
   else {
     x[2] = xs - h;
}

   f_x[0] = f(x[0]); f_x[1] = f(x[1]); f_x[2] = f(x[2]);

 for (k = 0; k < max_step; k++)
 {

      if (f_x[0] < f_x[1]) {

         if (f_x[0] < f_x[2]) i_min = 0;
         else i_min = 2;
	  }
      else {

         if (f_x[1] < f_x[2]) i_min = 1;
         else i_min = 2;
	  }

      a1 = (f_x[1] - f_x[0]) / (x[1] - x[0]);
      a2 = 1.0 / (x[2]-x[1])*((f_x[2]-f_x[0]) / (x[2]-x[0])-(f_x[1]-f_x[0]) / (x[1]-x[0]));
      xn = (x[1]+x[0])*0.5-a1/(2*a2);
      f_xn = f(xn);

      if ((fabs((xn - x[i_min])/xn) < eps1) &&
		  (fabs((f_xn - f_x[i_min])/f_xn) < eps2))
		  return xn;

      if (f_x[0] >= f_x[1]){

         if (f_x[0] > f_x[2])  i_max = 0;
        else i_max = 2;


         if (f_x[1] > f_x[2]) i_max = 1; 
         else i_max = 2;
	  }

      if (f_xn < f_x[i_min]) {
        x[i_max] = xn;
        f_x[i_max] = f_xn;
	  }
      else{
        x[i_max] = 2*x[i_min]-xn;
        f_x[i_max] = f(x[i_max]);
	 }
 }
	    return  xn;
}

int main(){
double x;
   x = Find(1, 0.5, 0.00001, 0.00001, 100);
   cout<< x << endl;
   cout<< f(x) << endl;
system("pause");
return 0;
}


нужно реализовать метод пауэлла интерполяции.
Алгоритм квадратичной интерполяции:

1. Вычислить f(A), f(A+H).

2. Если f(A)<f(A+H), то взять в качестве третьей точки A-H и вычислить f(A-H). В противном случае взять точку A+2H и вычислить f(A+2H).

3. Используя эти три точки, найти аппроксимацию точки минимума δ и вычислить f(δ).

4. Если разность между f(δ) и предыдущим наименьшим значением функции меньше заданной точности, то процедура заканчивается.

5. Если процедура не завершилась на шаге 4, то точка с наибольшим значением отбрасывается и выполняется переход на шаг 3. Но если, оставив точку с наибольшим значением, мы определим конечные границы интервала, в котором лежит минимум, то следует действительно оставить эту точку, отбросить другую и вернуться на шаг 3.
У меня не получается 4 шаг.
Denis1221 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализовать метод Эйлера и метод Рунге-Кутте 4-ого порядка на языке С++ Janny2014 Помощь студентам 1 27.11.2013 05:23
Метод перебора, Метод дихотомии, Метод золотого сечения Delphi !!! OneBri Помощь студентам 0 03.10.2012 08:42
исследовать метод квадратных корней и метод Холецкого для решения СЛАУ Vит@x@ Помощь студентам 0 22.11.2011 10:47
Задача Коммивояжера. Метод Монте-Карло и метод приращений. [Паскаль] U9110 Помощь студентам 4 06.04.2011 09:48
Turbo Pascal[програмыки : текстовая\метод симпсона\метод половинного деления qsccsq Помощь студентам 7 24.12.2010 05:23