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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2015, 05:26   #1
DJONIII
Новичок
Джуниор
 
Регистрация: 21.09.2015
Сообщений: 4
Восклицание Перевод с паскаля на Си++

Здравствуйте дорогие форумчане!!!
Помогите пожалуйста перевести программу с паскаля на си++, не шарю в переводах...
Код:
program tst
 integer, parameter :: n = 2
 real(8) X(n), delta, delta_thres, rho
 real(8), external :: Rosenbrock
 delta = 0.4_8
 delta_thres = 1.0e-5_8
 rho = 0.5_8
 ! Начальная точка
 X(1) = 5.0_8
 X(2) = -5.0_8
 ! Поиск минимума функции Розенброка
 call hjeeves(Rosenbrock, X, n, delta, delta_thres, rho)
 !
 ! Результат
 print *, 'X = ', X
end program tst
!
! Выполняет поиск экстремума (минимума) функции F
subroutine hjeeves(F, X, n, delta, delta_thres, rho)
 real(8) :: F, X(n), delta, delta_thres, rho
 integer n
 real(8) :: XNxt(n), XNxt2(n)
 integer k, kMx, j
 k = 0
 ! Предельное число итераций (убрать после отладки)
 kMx = 100000
 print *, 'Initial point = ', X
 print *, 'rho = ', rho
 print *, 'delta_thres = ', delta_thres
 do while (delta > delta_thres .and. k < kMx)
  xNxt = Erkunden(X)
  ! Функция ql сравнивает два вектора на предмет их равенства
  if (ql(X, XNxt)) then
   delta = rho * delta
  else
   XNxt2 = 2.0_8 * XNxt - X
   XNxt2= Erkunden(XNxt2)
   if (F(XNxt2, n) < F(XNxt, n)) then
    X = XNxt2
   else
    X = XNxt
   end if
  end if
   k = k + 1
 end do
 print *, 'Number of iterations k = ', k
!
contains
!
! Выполняет покоординатное сравнение двух векторов
logical function ql(v, v2)
 real(8) v(n), v2(n)
 integer j
 ql = .true.
 do j = 1, n
  ql = ql .and. (v(j) == v2(j))
 end do
end function ql
!
! Поочередно делает шаг по каждой из координатных осей
! Выбирается шаг, дающий лучший результат
function Erkunden(X)
 real(8), dimension(n) :: Erkunden, X
 real(8) xNxt(n), fvX, fvXNxt
 integer j
 fvX = F(X, n)
 Erkunden = X
 do j = 1, n
  XNxt(j) = X(j) + delta
  fvXNxt = F(XNxt, n)
  if (fvXNxt < fvX) then
   Erkunden = XNxt
   fvX = fvXNxt
  else
   XNxt(j) = X(j) - delta
   fvXNxt = F(XNxt, n)
   if (fvXNxt < fvX) then
    Erkunden = XNxt
    fvX = fvXNxt
   end if
  end if
 end do
end function Erkunden
!
end subroutine hjeeves
!
real(8) function Rosenbrock(X, n)
 real(8) X(n)
 integer n
 Rosenbrock = (1.0_8 - X(1))**2 + 100.0_8 * (X(2) - X(1) * X(1) )**2
end function Rosenbrock

Приводится Фортран-реализация поиска минимума функции методом Хука-Дживса. В качестве тестовой берется функция Розенброка

f(x1, x2) = (1 – x1)^2 + 100 * (x2 – x1^2)^2

Глобальный минимум функции равен 0.0 и находится в точке (x1, x2) = (1.0, 1.0).
При работе с функцией Розенброка для проверки используемого метода в качестве начальной часто берут точку
(-5, 10)
или точку
(-2.048, 2.048).
DJONIII вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод с паскаля на си++ slasty Общие вопросы C/C++ 4 05.01.2014 15:15
Перевод с Паскаля на C/C++ born2k Общие вопросы C/C++ 3 24.05.2012 18:39
Перевод из паскаля на СИ Кот Шрёдингера Помощь студентам 0 02.11.2011 20:07
перевод из паскаля в с++ dANIL282 Помощь студентам 2 21.01.2011 00:05
Перевод с Паскаля на С RamilFaz Общие вопросы C/C++ 3 08.04.2010 14:40