![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 11.05.2009
Сообщений: 14
|
![]()
на паскале написана программа для реализации алгоритма поиска по симплексу, но проблема за ключается в том, что ответ программа высчитывает неверный. Посмотрите, пожалуйста, может кто подскажет что упустил в коде. Код:
Program z; Uses Crt; Var d1, d2, alfa, e : real; X, Y : Array[0..2] Of real; Xc, S, n : Array[0..2] Of real; i, j, q, min, max, M : integer; Xold, Yold : real; flag1, flag2 : boolean; {W - целевая функция} Function W(V1, S1 : real) : real; Begin W := 34600 + 542 * V1 + 20 * S1 - 2.4 * Sqr(V1) - 1.05 * V1 * S1; End; Begin Clrscr; alfa := 0.5; {масштабный множитель} M := 4; {максимальное кол-во повторов вершины} e := 0.00001; flag2 := true; X[0] := 1; {Начальные значения точки Хо} Y[0] := 1; While flag2 Do {цикл, где уменьшается размер симплекса} Begin n[0] := 0; n[1] := 0;; n[2] := 0; flag1 := true; {нет циклического движения} d1 := alfa * ((Sqrt(3) + 1)/(2 * Sqrt(2))); d2 := alfa * ((Sqrt(3) - 1)/(2 * Sqrt(2))); q := 0; {итерации} {находим две оставшиеся точки Х1 и Х2} X[1] := X[0] + d2; Y[1] := Y[0] + d1; X[2] := X[0] + d1; Y[2] := Y[0] + d2; While flag1 Do Begin {В каждой точке находим W} For i := 0 To 2 Do S[i] := W(X[i], Y[i]); min := 0; max := 0; {Находим точку, где минимальная и максимальная W} For i := 1 To 2 Do Begin IF S[min] > S[i] Then min := i; IF S[max] < S[i] Then max := i; End; Xold := X[min]; Yold := Y[min]; Case min of 0: Begin X[0] := X[1] + X[2] - X[0]; Y[0] := Y[1] + Y[2] - Y[0]; n[0] := 0; n[1] := n[1] + 1; n[2] := n[2] + 1; End; 1: Begin X[1] := X[0] + X[2] - X[1]; Y[2] := Y[0] + Y[2] - Y[1]; n[1] := 0; n[0] := n[0] + 1; n[2] := n[2] + 1; End; 2: Begin X[2] := X[1] + X[0] - X[2]; Y[2] := Y[1] + Y[0] - Y[2]; n[2] := 0; n[1] := n[1] + 1; n[0] := n[0] + 1; End; End; {проверка на повторяющуюся вершину} IF (n[0] = M) Or (n[1] = M) Or (n[2] = M) Then flag1 := false Else flag1 := true; q := q + 1; IF (Sqrt(Sqr(X[2] - X[1]) + Sqr(Y[2] - Y[1])) < e) Then Begin flag1 := false; flag2 := false; End; {flag1 = false при циклическом движении} End; X[0] := Xold; Y[0] := Yold; alfa := alfa - 0.0025; {уменьшаем размер симплекса} {условие выхода из цикла} IF alfa > 0 Then flag2 := true Else flag2 := false; {flag2 = true при alfa > 0} End; Writeln('S = ', X[max]); Writeln('V = ', Y[max]); Write('W = ', W(X[max], Y[max])); Readln; End. ответы программы: S = 117.631 V = 49.526 W = 60020.493 какие должны быть(примерно): S = 0 V = 110 W = 65000 |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
поиск в файле.Паскаль | Лешка | Помощь студентам | 6 | 12.01.2011 18:16 |
паскаль поиск | shark2010 | Помощь студентам | 5 | 22.04.2010 23:21 |
Бинарный поиск (Паскаль) | Zhanna5006 | Помощь студентам | 3 | 07.01.2010 09:52 |
бинарный поиск(паскаль) | MetR | Помощь студентам | 6 | 14.12.2009 15:46 |
поиск слова(паскаль) | MetR | Помощь студентам | 6 | 04.12.2009 22:26 |