bonjour tous,
Je veux effectuer une methode de Newton Raphson mais sans connaitre l'expression analytique de ma fonction.
1°) Voici mon problème:
J'ai deux paramètres d'une loi normale que je fais varier jusqu'à obtenir une courbe se rapprochant le plus de la loi normale avec theta=5.65 et nu=0.9.
Je note J l'erreur entre la courbe référence et la courbe calculé, pour retrouver les paramètres je cherche donc à minimiser l'erreur J.
2°) Voici le programme que j'ai effectué, pour la premiere itération j'ai fait une descente de gradient et pour la suite j'ai approché la dérivée par la pente donnée par la valeur de la fonction precedemment calculée
3°) Mon probleme est que mon code ne trouve pas de solution il part tres rapidement à l'infini (il diverge) pourtant en faisant une descente de gradient classique sur chaque iterations je retrouve bien la solution
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 clear all close all clc %-------------------------------------------------------------------------- periode=-10:1:10; gaussienne_de_base=(1/(5.65*sqrt(2*pi)))*exp((-1/2)*((periode-0.9)/5.65).^2); y_exp=gaussienne_de_base'; %-------------------------------------------------------------------------- iter=1; theta(iter)=10; J(iter)=100000000; nu(iter)=10; pas=0.1; gradient_J=zeros(2,1); critere_arret=10^-6; %-------------------------------------------------------------------------- tic %demarre compteur de temps %-------------------------------------------------------------------------- while iter<10; if iter==1; if J(iter) < critere_arret; break end A=loi_normale(theta(iter),nu(iter)); y_cal=A'; residu=y_exp-y_cal; J(iter)=residu'*residu; %casser le while si erreur > critere %------------------------ dtheta=0.0000001*theta(iter); dnu=0.0000001*nu(iter); y_cal_dtheta=loi_normale(theta(iter)+dtheta,nu(iter))'; y_cal_dnu=loi_normale(theta(iter),nu(iter)+dnu)'; %------------------------ residu_dtheta=y_exp-y_cal_dtheta; J_dtheta=residu_dtheta'*residu_dtheta; residu_dnu=y_exp-y_cal_dnu; J_dnu=residu_dnu'*residu_dnu; %------------------------ gradient_J(1,1)=(J_dtheta-J(iter))/dtheta; gradient_J(2,1)=(J_dnu-J(iter))/dnu; %------------------------ %descente de gradient theta(iter+1)=theta(iter)-pas*gradient_J(1); nu(iter+1)=nu(iter)-pas*gradient_J(2); else if J(iter-1) < critere_arret; break end A=loi_normale(theta(iter),nu(iter)); y_cal=A'; residu=y_exp-y_cal; J(iter)=residu'*residu; %casser le while si erreur > critere %------------------------ dtheta=0.000001*theta(iter); dnu=0.000001*nu(iter); y_cal_dtheta=loi_normale(theta(iter)+dtheta,nu(iter))'; y_cal_dnu=loi_normale(theta(iter),nu(iter)+dnu)'; %------------------------ residu_dtheta=y_exp-y_cal_dtheta; J_dtheta=residu_dtheta'*residu_dtheta; residu_dnu=y_exp-y_cal_dnu; J_dnu=residu_dnu'*residu_dnu; %------------------------ %newton theta(iter+1)=theta(iter)-(J(iter)./((J(iter)-J(iter-1))/(theta(iter)-theta(iter-1)))); nu(iter+1)=nu(iter)-(J(iter)./((J(iter)-J(iter-1))/(nu(iter)-nu(iter-1)))); end iter=iter+1; end
J'espere que vous pourrez m'aider car le programme est tres important pour moi.
merci d'avance
Partager