Statistiques
| Révision :

root / Final-Parameters_sm_fsn_fss_fsv / pulvinus-optimize.py @ 16

Historique | Voir | Annoter | Télécharger (3,69 ko)

1 9 akiss
import os
2 9 akiss
import numpy as np
3 9 akiss
from scipy.optimize import minimize
4 9 akiss
outputfile='temporary.csv'
5 9 akiss
6 9 akiss
7 9 akiss
# initial parameters
8 9 akiss
sm=0.95
9 9 akiss
fsn=0.5
10 9 akiss
fss=0.5
11 9 akiss
fsv=0.5
12 9 akiss
13 9 akiss
x0=[sm, fsn, fss, fsv]
14 9 akiss
15 9 akiss
# parameters obey the following bounds
16 9 akiss
#bnds = ((0, 1), (0, 1), (0, 1))
17 9 akiss
18 13 akiss
#bnds = ((0.5, 1.0), (0.1, 0.9), (0.1, 1.5), (0.1, 0.5))
19 13 akiss
bnds = ((0.25, 1.0), (0.1, 1.5), (0.1, 1.5), (0.1, 0.75))
20 9 akiss
21 9 akiss
# possible target quantities
22 9 akiss
# --------------------------
23 9 akiss
theta0=1 #38
24 9 akiss
# region deformation
25 9 akiss
am0=1.672631   # Mesophyl
26 9 akiss
an0=1.608788   # Nectary
27 9 akiss
as0=1.790434   # Side
28 9 akiss
av0=1.294615   # Vasculature
29 9 akiss
# strain anisotropy
30 9 akiss
anim=0.6247   # Mesophyl
31 9 akiss
anin=0.6172   # Nectary
32 9 akiss
anis=0.5489   # Side
33 9 akiss
aniv=0.6958   # Vasculature
34 9 akiss
35 9 akiss
# experimental standard deviation
36 9 akiss
stdtheta=0.21 #38
37 9 akiss
stdam=0.23   # Mesophyl
38 9 akiss
stdan=0.11   # Nectary
39 9 akiss
stdas=0.21   # Side
40 9 akiss
stdav=0.06   # Vasculature
41 9 akiss
#
42 9 akiss
stdanim=0.0532   # Mesophyl
43 9 akiss
stdanin=0.0378   # Nectary
44 9 akiss
stdanis=0.0741  # Side
45 9 akiss
stdaniv=0.0333   # Vasculature
46 9 akiss
47 9 akiss
a0=[theta0, am0, an0, as0, av0, anim, anin, anis, aniv]
48 9 akiss
stda=[stdtheta, stdam, stdan, stdas, stdav, stdanim, stdanin, stdanis, stdaniv]
49 9 akiss
50 9 akiss
# target quantities included in the objective function
51 9 akiss
var=np.array([1, 2, 3, 4]) # here theta is not included
52 9 akiss
#var=np.array([0, 1, 2, 3, 4]) # here theta (side angle) is included
53 9 akiss
#var=np.array([0, 1, 2, 3, 4, 5, 6, 7, 8]) # side angle, deformation and anisotropy are included
54 9 akiss
#var=np.array([5, 6, 7, 8]) # side angle, deformation and anisotropy are included
55 9 akiss
56 9 akiss
'''
57 9 akiss
# objectiv function 1
58 9 akiss
def f(x):
59 9 akiss
        res=0
60 9 akiss
        for i in range(len(x)):
61 9 akiss
                res+=(x[i]-a0[var[i]])**2/(x[i]+a0[var[i]])**2
62 9 akiss
        return res
63 9 akiss
'''
64 9 akiss
65 9 akiss
# objectiv function taking into account the experimental standard deviation for the weight
66 9 akiss
def f(x):
67 9 akiss
        res=0
68 9 akiss
        for i in range(len(x)):
69 9 akiss
                res+=(x[i]-a0[var[i]])**2/(stda[var[i]])**2
70 9 akiss
        return res
71 9 akiss
72 9 akiss
73 9 akiss
74 9 akiss
def objective(x):
75 9 akiss
        [sm, fsn, fss, fsv] = x
76 9 akiss
        os.system("FreeFem++ pulvinus4optimize.cpp -fsn "+str(fsn)+" -fss "+str(fss)+" -fsv "+str(fsv)+" -sm "+str(sm)+" -outfile "+outputfile)
77 9 akiss
        data=np.loadtxt(outputfile, delimiter=';', dtype=float)
78 9 akiss
        xvar=data[var+4]
79 9 akiss
        print(xvar)
80 9 akiss
        return f(xvar)
81 9 akiss
82 9 akiss
#
83 9 akiss
# GLOBAL OPTIMIZATION
84 9 akiss
#
85 9 akiss
86 9 akiss
from scipy.optimize import differential_evolution #New in version 0.15.0.
87 9 akiss
88 9 akiss
res = differential_evolution(objective, bounds=bnds)
89 9 akiss
res
90 9 akiss
91 9 akiss
92 9 akiss
'''
93 9 akiss

94 9 akiss
###############################################################
95 9 akiss
###############################################################
96 11 akiss
# fitting the observed expansions        K=lambda+2*mu/3 (d=3 formula)
97 9 akiss
###############################################################
98 9 akiss
###############################################################
99 14 akiss

100 9 akiss
Ok: Normal End
101 14 akiss
[1.67263 1.60879 1.79043 1.29461]
102 14 akiss
Out[2]:
103 14 akiss
     fun: 7.656738339961133e-09
104 9 akiss
 message: 'Optimization terminated successfully.'
105 14 akiss
    nfev: 4745
106 14 akiss
     nit: 78
107 9 akiss
 success: True
108 14 akiss
       x: array([0.54006051, 0.95448193, 1.21647743, 0.50956303])
109 9 akiss

110 9 akiss

111 11 akiss
Results in the results file:
112 9 akiss

113 11 akiss
/*
114 11 akiss
sm;fsn;fss;fsv;sideangle;am;an;as;av;sam;san;sas;sav;
115 11 akiss
*/
116 14 akiss
-0.540061;0.954482;1.21648;0.509563;0.477428;1.67263;1.60879;1.79043;1.29461;0.963544;0.973407;0.942094;0.935191
117 11 akiss

118 11 akiss

119 11 akiss
###############################################################
120 11 akiss
###############################################################
121 11 akiss
# fitting the observed expansions        K=lambda+mu (d=2 formula)
122 11 akiss
###############################################################
123 11 akiss
###############################################################
124 11 akiss
Ok: Normal End
125 15 akiss
[1.67263 1.60879 1.79043 1.29461]
126 15 akiss
Out[3]:
127 15 akiss
     fun: 7.656738339961133e-09
128 11 akiss
 message: 'Optimization terminated successfully.'
129 15 akiss
    nfev: 5825
130 15 akiss
     nit: 96
131 11 akiss
 success: True
132 15 akiss
       x: array([0.46445277, 0.95448186, 1.21647529, 0.5095638 ])
133 11 akiss

134 11 akiss

135 9 akiss
Results in the results file:
136 9 akiss

137 9 akiss
/*
138 9 akiss
sm;fsn;fss;fsv;sideangle;am;an;as;av;sam;san;sas;sav;
139 9 akiss
*/
140 15 akiss
-0.464453;0.954482;1.21648;0.509564;0.477427;1.67263;1.60879;1.79043;1.29461;0.963544;0.973407;0.942095;0.935191
141 9 akiss

142 9 akiss

143 9 akiss

144 9 akiss
'''