Численное решение дифференциального уравнения первого порядка методом Эйлера

Санкт-Петербургский государственный морской технический университет

Факультет морского приборостроения

Кафедра корабельных автоматизированных комплексов и информационно-управляющих систем

Курсовой проект по информатике

На тему:

“Численные методы оптимизации”

Выполнил:

Студент первого курса

Грязнов Сергей Вадимович

Научный руководитель:

Потапов Андрей Анатольевич

Санкт-Петербург 2014

Нахождение минимума функции одной переменной методом квадратичной аппроксимации…………………………………………………………................3

Нахождение минимума функции двух переменных методом последовательного приближения………………………………………………………………………5

Нахождение минимума функции нескольких переменных методом покоординатного спуска………………………………………………………….8

Численное решение дифференциального уравнения первого порядка методом Эйлера…………………………………………………………………………….11

Численное решение дифференциального уравнения второго порядка методом Эйлера…………………………………………………………………………….13

Вычисление факториала методом рекурсии…………………………………...15

Линейная аппроксимация таблично заданной функции одного аргумента…………………………………………………………………………16

Нахождение минимума функции одной переменной методом квадратичной аппроксимации

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

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.

Нахождение минимума функции двух переменных

Методом последовательного приближения

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

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.

Нахождение минимума функции нескольких переменных методом покоординатного спуска

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

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.

Численное решение дифференциального уравнения первого порядка методом Эйлера

Численное решение дифференциального уравнения первого порядка методом Эйлера - student2.ru

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.

Наши рекомендации