bonjour à tous,
j'ai un problème que ça fait un bout de temps que je tourne rond et j'arrive pas à m'en sortir, voilà: je fait l'étude d'une fonction contrainte dont je doit identifier les paramètres p(1), p(2) et p(3) sachant les valeurs numérique de celle ci en certain points, j'ai trouvé un code qui est supposé répondre à ma requête seulement il ne m'affiche aucun résultat
voici le code source
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
| close all;
clear all;
clc;
x=[10800 43200 86400 172800 604800]; %input of f (it's time in second)
y=[0.32454 0.37863 0.5409 0.64908 0.75726]; %output of f
p0=[5 10 30]; %initialisation des paramètre qui est aléatoire
tol=1;
N = length(x);
f = @model_func_exp;
F0 = y;
M = length(p0);
p = p0;
norm_dp = 10*tol;
while norm_dp > tol
for i = 1:N
F(i) = f(x(i), p, 0);
for j = 1:M
J(i,j) = f(x(i), p, j);
end
end
H = J'*J;
b = -J'*(F-F0)';
dp = (H\b)';
norm_dp=sqrt(dp*dp');
p = p + dp;
end
plot(y) |
et voici la fonction f
1 2 3 4 5 6 7 8 9 10
| function y = model_func_exp(x, p, k)
if k==0
y = p(1)*atanh(tanh((1/p(1))*(32.2-p(2))))*exp(-(2*p(3)*x)/p(1))+p(2);
elseif k==1
y = (atanh(tanh((32.2-p(2))/p(1)))+((p(2)-32.2)/p(1))*(1/(cosh((32.2-p(2))/p(1))*cosh((32.2-p(2))/p(1))))*(1/(1-(tanh((32.2-p(2))/p(1))*tanh((32.2-p(2))/p(1)))))+(2*p(3)*x/p(1))*atanh(tanh((1/p(1))*(32.2-p(2)))))*exp(-(2*p(3)*x)/p(1));
elseif k==2
y = p(1)*exp(-(2*p(3)*x)/p(1))*(-1/p(1))*(1/(cosh((32.2-p(2))/p(1))*cosh((32.2-p(2))/p(1))))*(1/(1-(tanh((32.2-p(2))/p(1))*tanh((32.2-p(2))/p(1)))))+1;
elseif k==3
y = -2*x*atanh(tanh((1/p(1))*(32.2-p(2))))*exp(-(2*p(3)*x)/p(1));
end |
ici le message d'erreur
Warning: Matrix is singular to working precision.
> In code at 23 (càd dp = (H\b)')
RQ: je n'ai aucune idée sur les valeurs initiales de p0 donc ils sont aléatoires
Partager