2016-12-09 3 views
0

J'essaie de résoudre des équations non linéaires en utilisant la commande fsolve dans Matlab. J'ai une routine principale et j'écris une fonction dans laquelle je définis les équations que je veux résoudre.comment définir la fonction pour résoudre des équations non linéaires simultanées dans Matlab en passant plus de variables

Voici ma routine principale:

t = [338.9333333333,535.2,1217.4166666667,1797.3166666667,2082.9166666667,4557.0166666667,4690.2666666667,4717.5333333333,4981.3666666667,5346.9,5388.3166666667,5571.65,5619.65,6639.35,6719.35,7352.7666666667,7622.7666666667,7722.7666666667,7739.4333333333,7906.1,7909.7666666667,8502.7666666667,9852.7666666667,20571.0166666667,21368.6333333333,23948.6333333333,26789.6333333333,28598.6333333333,29828.6333333333,29859.6333333333,35469.6333333333,39938.6333333333,41186.6333333333,45956.6333333333,46378.6333333333,46496.6333333333,47493.6333333333,48958.6333333333,50228.6333333333,51716.6333333333,71876.6333333333]; 
n= length(t); 

syms a b1 b2 amle b1mle b2mle 
tau=zeros; 

for tau=2:n-1 

fun = @root2d; 
x0=[0.0002,0.00004]; 
x=fsolve(fun,x0) 

tau=tau+1; 
end 

et j'ai écrit une fonction séparément et enregistré comme root2d.m que je ne pouvais pas insérer la fonction dans la boucle. Voici ma fonction:

function F = root2d(x) 
sum2=0; 
for k=1:tau 
    sum2 = sum2+(2/x(1))-t(k); 
    k=k+1; 
end 

sum3=0; 
for l=tau+1:n 
    sum3=sum3+(2/x(2))+t(tau)-t(l); 
    l=l+1; 
end 

F(1) = ((n*x(1)*(t(tau))^2)/(1-exp(x(1)*t(tau))+exp(x(1)*t(tau)-x(2)*(t(n)-t(tau)))*(1+x(2)*(t(n)-t(tau))))) + sum2; 
F(2) = ((n*x(2)*(t(n)-t(tau))^2)/(1+x(2)*(t(n)-t(tau))+exp(x(2)*(t(n)-t(tau)))*((1+x(1)*t(tau))*exp(-x(1)*t(tau))-2))) + sum3; 
end 

Cependant, cela ne fonctionne pas jusqu'à ce que je définis t, n, et tau dans la fonction. J'ai essayé de définir la fonction en tant que root2d (x, t, tau) mais cela ne fonctionne pas. Existe-t-il un moyen de transmettre les variables à la fonction et de résoudre ce problème?

Répondre

2

Vous pouvez ajouter t, n et paramètres tau à la fonction root2d:

function F = root2d(x, t, n, tau) 
... 
end 

Puis, en boucle principale vous

fun = @(x) root2d(x, t, n, tau); 

Maintenant, le plaisir est une fonction d'un argument qui appellent root2d avec tous arguments nécessaires.

+0

Merci beaucoup, cela fonctionne maintenant sans aucune erreur. J'apprécie vraiment votre aide avec ceci. –