Санкт-Петербургский государственный морской технический университет
Факультет морского приборостроения
Кафедра корабельных автоматизированных комплексов и информационно-управляющих систем
Курсовой проект по информатике
На тему:
“Численные методы оптимизации”
Выполнил:
Студент первого курса
Грязнов Сергей Вадимович
Научный руководитель:
Потапов Андрей Анатольевич
Санкт-Петербург 2014
Нахождение минимума функции одной переменной методом квадратичной аппроксимации…………………………………………………………................ 3
Нахождение минимума функции двух переменных методом последовательного приближения……………………………………………………………………… 5
Нахождение минимума функции нескольких переменных методом покоординатного спуска…………………………………………………………. 8
Численное решение дифференциального уравнения первого порядка методом Эйлера……………………………………………………………………………. 11
Численное решение дифференциального уравнения второго порядка методом Эйлера……………………………………………………………………………. 13
Вычисление факториала методом рекурсии…………………………………... 15
Линейная аппроксимация таблично заданной функции одного аргумента………………………………………………………………………… 16
Нахождение минимума функции одной переменной методом квадратичной аппроксимации
Program А8;
var
x1,x2,x3,xshtr,xm,Fm,a1,a2: real;
function
f(x:real):real;
begin
f:=x*x;
end;
begin
Ex:=0.001;
Ef:=0.001;
dx:=1;
x1:=5;
while abs(Fm-F(xshtr))>Ef do
begin
while abs(xm-xshtr)>Ex do
begin
x2:=x1+dx;
if F(x1)>F(x2) then x3:=x1+2*dx else x3:=x1-dx;
if F(x1)<F(x2)
then if F(x1)<F(x3)
then
begin
Fm:=F(x1);
xm:=x1;
end
else
begin
Fm:=F(x3);
xm:=x3;
end
else if F(x2)<F(x3)
then
begin
Fm:=F(x2);
xm:=x2;
end
else
begin
Fm:=F(x3);
xm:=x3;
end;
a1:=(F(x2)-F(x1))/(x2-x1);
a2:=(1/(x3-x2))*((F(x3)-F(x1))/(x3-x1)-(F(x2)-F(x1))/(x2-x1));
xshtr:=(x2+x1)/2-(a1/(2*a2));
if (F(xm)<F(xshtr)) then x1:=xm else x1:=xshtr;
end;
end;
writeln('xmin=',xm);
end.
Нахождение минимума функции двух переменных
Методом последовательного приближения
Program А9;
Var
L,x,y,x1,y1,x0,y0,dx,dy,Ex,Ey,E,sign:real;
function f(x,y:real):real;
begin
f:=sqr(x)+sqr(y);
end;
begin
L:=1;
sign:=-1;
x0:=100;
y0:=100;
E:=0.0001;
Ex:=0.0001;
Ey:=0.0001;
while L>E DO
begin
dx:=0.1;
y:=y0;
x:=x0;
while abs(dx)>Ex DO
begin
x1:=x+dx;
if f(x1,y)<f(x,y) then
x:=x1
else
dx:=-dx/2;
end;
writeln(x,y,f(x,y));
dy:=0.1;
y:=y0;
while abs(dy)>Ey DO
begin
y1:=y+dy;
if f(x,y1)<f(x,y) then
y:=y1
else
dy:=-dy/2;
end;
writeln(x,y,f(x,y));
L:=sqrt(sqr(x1-x0)+sqr(y1-y0));
y0:=y1;
x0:=x1;
end;
writeln(x1,y1,f(x1,y1));
readln;
end.
Нахождение минимума функции нескольких переменных методом покоординатного спуска
Program A10;
type
vector=array[1..N] of real;
var
x0,x,x2:vector;
dx,S,L:real;
i,j:integer;
function
F(x:vector):real;
var
SFunct:real;
iFunct:integer;
begin
SFunct:=0;
for iFunct:=1 to N do SFunct:=SFunct+sqr(x[i]*x[i]);
F:=SFunct+1000;
end;
begin
N:=3;
e:=0.001;
ex:=0.001;
dx0:=1;
for i:=1 to N do x0[i]:=-10;
L:=10;
while abs(L)>=E do
begin
for i:= 1 to N do x[i]:=x0[i];
i:=1;
while i<=N do
begin
dx:=dx0;
while abs(dx)>=Ex do
begin
for j:= 1 to N do x2[j]:=x0[j];
x2[i]:=x0[i]+dx;
if F(x0)>F(x2)
then
begin
x0[i]:=x2[i];
end
else
begin
dx:=-dx/2;
end;
end;
i:=i+1;
end;
S:=0;
for i:=1 to N do
begin
S:=S+(x0[i]-x[i])*(x0[i]-x[i]);
end;
L:=sqrt(S);
end;
for i:=1 to N do writeln('xmin[',i,']=',x0[i],' ');
end.
Численное решение дифференциального уравнения первого порядка методом Эйлера
Program A11;
var
t,t0,tp,V,V0,V1,F,m:real;
begin
dtp=0.5;
dt=0.0001;
tmax=5.0;
t0:=0;
V0:=0;
F:=1;
m:=1;
tp:=0;
t:=t0;
V:=V0;
while t<tmax do
begin
V1:=F/m;
V:=V+V1*dt;
t:=t+dt;
if t>=tp then
begin
writeln('t=',t,' V=',V);
tp:=tp+dtp;
end;
end;
end.