Я написал следующий код:
Код: Выделить всё
`import numpy as np
import pykep as pk
import math
from scipy.integrate import odeint
import pygmo as pg
import matplotlib.pyplot as plt
from scipy.optimize import minimize
from scipy.optimize import fsolve
from mpl_toolkits.mplot3d import Axes3D
mu_sun = pk.MU_SUN*10**(-9) #km^3/s^2
r_earth = 1.496e8 #raggio orbitale Terra km
r_mars = 2.279e8 #raggio orbitale Marte km
#orbita di trasferimento Hohmann
a_transfer = (r_earth+r_mars)/2
t_of = 348.79*pk.DAY2SEC
g0 = 9.80665
thrust = 0.5 #N
Isp = 2000 #s
m0 = 1000 #kg
earth = pk.planet.jpl_lp('earth') #effemeridi Terra
mars = pk.planet.jpl_lp('mars') #effemeridi Marte
r0 = [-140699693, -51614428, 980] #km lista, propagate lagrangian vuole liste
v0 = [9.774596, -28.07828, 4.337725*10**(-4)] #km/s
rM = [-172682023, 176959469, 7948912] #km
vM = [-16.427384, -14.860506, 9.21486*10**(-2)] #km/s
r_fwd, v_fwd = pk.propagate_lagrangian(r0, v0, t_of/2, mu_sun) #non so se è giusto, comunque devo vedere se vanno messi qui o no
r_bwd, v_bwd = pk.propagate_lagrangian(rM, vM, -t_of/2, mu_sun)
class Optimization:
def __init__(self, r_i, v_i, r_f, v_f, m0, Isp, mu, g0, t_of, r_fwd, v_fwd, r_bwd, v_bwd):
self.r_i = r0
self.v_i = v0
self.r_f = rM
self.v_f = vM
self.m0 = m0
self.Isp = Isp
self.mu = mu
self.g0 = g0
self.t_of = t_of
self.r_fwd = r_fwd
self.v_fwd = v_fwd
self.r_bwd = r_bwd
self.v_bwd = v_bwd
def fitness(self, x):
mf = x[0]
constraint_posx = self.r_fwd[0] - self.r_bwd[0]
constraint_posy = self.r_fwd[1] - self.r_bwd[1]
constraint_posz = self.r_fwd[2] - self.r_bwd[2]
constraint_velx = self.v_fwd[0] - self.v_bwd[0]
constraint_vely = self.v_fwd[1] - self.v_bwd[1]
`constraint_velz = self.v_fwd[2] - self.v_bwd[2]`
dV_fwd = np.linalg.norm(np.array(self.v_fwd)-np.array(self.v_i))
dV_bwd = np.linalg.norm(np.array(self.v_bwd)-np.array(self.v_f))
m_fwd = self.m0*np.exp(-dV_fwd/(self.Isp*self.g0))
mf = m_fwd*np.exp(-dV_fwd/(self.Isp*self.g0))
m_bwd = mf*np.exp(dV_bwd/(self.Isp*self.g0))
constraint_mass = m_fwd-m_bwd
J = -mf
constraints = [constraint_posx, constraint_posy, constraint_posz, constraint_velx, constraint_vely, constraint_velz, constraint_mass]
return [J] + constraints
def get_bounds(self):
return([0], [self.m0])
def get_nec(self):
return 7
def get_ni(self):
return 0
prob = pg.problem(Optimization(r0, v0, rM, vM, m0, Isp, mu_sun, g0, t_of, r_fwd, v_fwd, r_bwd, v_bwd))
algo = pg.algorithm(pg.nlopt('slsqp'))
pop = pg.population(prob,10)
pop = algo.evolve(pop)
best_solution = pop.champion_x
mf_final = best_solution
print(mf_final)
`
Подробнее здесь: https://stackoverflow.com/questions/790 ... sing-pygmo