Bonjour à vous,

Je vous explique mon problème, je dois caractériser la loi de comportement d'un acier. J'ai réalisé divers essais expérimentaux et j'ai gardé 3 jeux de paramètres (3 essais à divers vitesses de plastifications).

J'utilise une fonction de type Johnson-Cooke. (Fonction à évaluer de 5 paramètres)

Maintenant, je dois optimiser tout cela. Ainsi, j'utilise la fonction leastsq qui utilise un algorithme de Levenberg Marquardt.

Le but est d'avoir les mêmes paramètres de sortie pour les 3 fonctions à évaluer. Je somme mes 3 fonctions cout mais une erreur apparaît...

Voila le code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#Importation des différents modules.
 
from scipy import *
from scipy.optimize import leastsq
import scipy.io.array_import
from pylab import *
import matplotlib.pyplot as ptt
import numpy as np
import pylab
import Tkinter as tk
import math
 
 
 
#Importation fichier0.0008
filename=('fichier0,008.txt')
data = scipy.io.array_import.numpy.loadtxt(filename)
 
#La colonne 0 du fichier sera les valeurs en x, et la colonne 1 sera celle des y
y1 = data[:,1]
x1 = data[:,0]
 
#Importation fichier0.0008
filename=('fichier0,8.txt')
data = scipy.io.array_import.numpy.loadtxt(filename)
 
#La colonne 0 du fichier sera les valeurs en x, et la colonne 1 sera celle des y
y2 = data[:,1]
x2 = data[:,0]
 
#Importation fichier0.0008
filename=('fichier3,8.txt')
data = scipy.io.array_import.numpy.loadtxt(filename)
 
#La colonne 0 du fichier sera les valeurs en x, et la colonne 1 sera celle des y
y3 = data[:,1]
x3 = data[:,0]
 
#FONCTION A EVALUER
def peval1(x1,p): 
	return (p[0]+((p[1])*(x1**(p[2]))))* (1+(p[3])*(log(p[4]/0.0008)))
 
#Fonction cout epsilon_point=0.0002
def residuals1(p, y1, x1): 
	err1 = y1 - peval(x1,p) 
	return err1
 
#FONCTION A EVALUER
def peval2(x2,p): 
	return (p[0]+((p[1])*(x2**(p[2]))))* (1+(p[3])*(log(p[4]/0.8)))
 
#Fonction cout epsilon_point=0.0002
def residuals2(p, y2, x2): 
	err2 = y2 - peval2(x2,p) 
	return err2
 
#FONCTION A EVALUER
def peval3(x3,p): 
	return (p[0]+((p[1])*(x3**(p[2]))))* (1+(p[3])*(log(p[4]/3.8)))
 
#Fonction cout epsilon_point=0.0002
def residuals3(p, y3, x3): 
	err3 = y3 - peval3(x3,p) 
	return err3
 
#Sommation des 3 fonctions cout
def residualsToTal(p, y1, y2, y3, x1, x2, x3):
        errTOT = y1 + y2 + y3 - peval1(x1,p) - peval2(x2,p) - peval3(x3,p)
        return errTOT
 
 
#Initialisation, nous entrons un jeu de paramètres "assez" proches des paramètres optimaux
#A1_0 = 1
A_0= 100
B_0= 200
n_0= 0.42
C_0= 0.02
EP_0= 0.005
pname = (['A1','A2','k1','k2','n1'])
p0 = array([A_0, B_0, C_0, n_0, EP_0])
 
 
 
#Appel de l'algorithme de LM
plsq = leastsq(residualsToTal, p0, args=(y1, x1, y2, x2, y3, x3), maxfev=50000)
 
#Affichage des paramètres optimaux
print plsq[0]
Et l'erreur :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
Traceback (most recent call last):
  File "C:\Documents and Settings\gair-da\Bureau\FittingComplet.py", line 96, in <module>
    plsq = leastsq(residualsToTal, p0, args=(y1, x1, y2, x2, y3, x3), maxfev=50000)
  File "C:\Python26\lib\site-packages\scipy\optimize\minpack.py", line 266, in leastsq
    m = check_func(func,x0,args,n)[0]
  File "C:\Python26\lib\site-packages\scipy\optimize\minpack.py", line 12, in check_func
    res = atleast_1d(thefunc(*((x0[:numinputs],)+args)))
  File "C:\Documents and Settings\gair-da\Bureau\FittingComplet.py", line 79, in residualsToTal
    errTOT = y1 + y2 + y3 - peval1(x1,p) - peval2(x2,p) - peval3(x3,p)
ValueError: shape mismatch: objects cannot be broadcast to a single shape
A savoir que l'algo fonctionne parfaitement avec ce code:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#Importation des différents modules.
 
from scipy import *
from scipy.optimize import leastsq
import scipy.io.array_import
from pylab import *
import matplotlib.pyplot as ptt
import numpy as np
import pylab
import Tkinter as tk
import math
 
 
 
#Importation fichier0.0008
filename=('fichier0,008.txt')
data = scipy.io.array_import.numpy.loadtxt(filename)
 
#La colonne 0 du fichier sera les valeurs en x, et la colonne 1 sera celle des y
y = data[:,1]
x = data[:,0]
 
#FONCTION A EVALUER
def peval(x,p): 
	return (p[0]+((p[1])*(x**(p[2]))))* (1+(p[3])*(log(p[4]/0.0002)))
 
#Fonction cout epsilon_point=0.0002
def residuals(p, y, x): 
	err = y - peval(x,p) 
	return err
 
#Initialisation, nous entrons un jeu de paramètres "assez" proches des paramètres optimaux
#A1_0 = 1
A_0= 100
B_0= 200
n_0= 0.42
C_0= 0.02
EP_0= 0.005
pname = (['A1','A2','k1','k2','n1'])
p0 = array([A_0, B_0, C_0, n_0, EP_0])
 
 
 
#Appel de l'algorithme de LM
plsq = leastsq(residuals, p0, args=(y, x), maxfev=50000)
 
#Affichage des paramètres optimaux
print plsq[0]
Merci d'avance
Cordialement,
Strychnine