![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() |
Falex |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 7 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот реализовал метод ломаных для поиска глобального экстремума функции.
Не могли бы Вы мен подсказать как оптимизировать мою программу,сделать её меньше. И значение функции у меня вычисляет 2*N+2 раз,хотя должно быть N+2.Спасибо. Код type TMyData = record U:real; J: real; end ... var MCut: TMCut; min,L,a,b,Ucur,Uold: real; Icur,Iold,i_func: integer; PtsData: array of TMyData; implementation {$R *.dfm} function Getfunc(x: real) :real; begin Result:=7.667*sin(5.983*x)-6*x; inc(i_func); end; function GetL(m:integer):real; var i:integer;h,temp_L:real; v,Q:array of real; begin SetLength(v,m+1); SetLength(Q,m+1); i_func:=0; end; function GetIntersect(i: integer): real; begin GetIntersect:=(PtsData[i].J-PtsData[i+1].J+51.8716171862423 * (PtsData[i].U+PtsData[i+1].U))/(2*51.8716171862423); end; procedure InsertNew(X: real); var i,j: integer; begin i:=0; while PtsData[i].U<X do inc(i); SetLength(PtsData,Length(PtsData)+1); for j:=Length(PtsData)-1 downto i+1 do begin PtsData[j].U:=PtsData[j-1].U; PtsData[j].J:=PtsData[j-1].J; end; PtsData[i].U:=X; PtsData[i].J:=GetFunc(X); end; procedure SortIt; var j: integer; begin for j:=0 to Length(PtsData) do begin if PtsData[j].U>PtsData[j+1].U then begin PtsData[j].U:=PtsData[j].U+PtsData[j+1].U; PtsData[j+1].U:=PtsData[j].U-PtsData[j+1].U; PtsData[j].U:=PtsData[j].U-PtsData[j+1].U; PtsData[j].J:=PtsData[j].U+PtsData[j+1].J; PtsData[j+1].J:=PtsData[j].U-PtsData[j+1].J; PtsData[j].J:=PtsData[j].U-PtsData[j+1].J; end; end; end; function GetMinIndex: integer; var i,j: integer; min: real; begin min:=PtsData[0].J; for i:=1 to Length(PtsData)-1 do begin if PtsData[i].J<min then begin min:=PtsData[i].J; j:=i; end; end; GetMinIndex:=j; end; procedure TMCut.BitBtn1Click(Sender: TObject); var Un,Un2,Eps: real; i,k,j,len: integer; begin SetLength(PtsData,2); a:=StrToFloat(Edit1.Text); b:=StrToFloat(Edit2.Text); Eps:=abs(StrToFloat(Edit5.Text)); GetL(10000); PtsData[0].U:=(a+b)/2; PtsData[0].J:=GetFunc(PtsData[0].U); PtsData[1].U:=b; PtsData[1].J:=GetFunc(PtsData[1].U); k:=1; Uold:=PtsData[k-1].U; Ucur:=PtsData[k].U; Icur:=k; Iold:=k-1; i:=0; while (abs(Uold-Ucur)>=Eps) or (i<30) do begin inc(i); if k<Length(PtsData) then begin Un:=GetIntersect(k-1); Un2:=GetIntersect(k); end; InsertNew(Un); InsertNew(Un2); k:=GetMinIndex; if (abs(Uold-Ucur)/2<Eps) and ((Uold-Ucur)<>0) then break; begin Uold:=Ucur; Iold:=Icur; Icur:=k; Ucur:=PtsData[k].U; end; end; Memo1.Lines.Add('решение = '+Format('%2.8f',[PtsData[k].u])); Memo1.Lines.Add('функция = '+Format('%2.8f',[PtsData[k].j])); Memo1.Lines.Add('итерации = '+IntToStr(i)); Memo1.Lines.Add('вычисление функции = '+IntToStr(i_func)); end; Сообщение отредактировано: volvo - 10.03.2006 12:55 Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 25.07.2025 22:13 |