2017-10-05 5 views
-1

J'essaie de trouver la racine d'une contrainte d'équation en utilisant la méthode de Newton (ouverte à toute autre méthode). La contrainte d'équation dépend des racines d'une équation quadratique qui a un terme inconnu. Les descriptions d'équations (quadratique et contrainte) sont présentées ci-dessous. Les racines de l'équation quadratique sont supposées être p1 et p2.Méthode de Newton

x^2 + x*(c1*unknown/2 + C1*c2)/(c1*c2*c3*unknown/2) + 1/(c1*c2*c3*u/2) = 0 

avec la contrainte

(1/(p2-p1))*(exp(-0.3*p2) - 1)*(c1*c2 - p2) - (exp(-0.3*p1) - 1)*(c1*c2 - p1) - 0.04 = 0 

Je me demande s'il y a d'autres méthodes d'approximation pour résoudre ce problème si la méthode de Newton ne va pas le faire.

Matlab code

p0=10*10^6; 
Cc=0.65*10^-6;Rp=100*10^3;Cp=55*10^-9; z1=1/(Cp*Rp); 
N = 100;error = 0.02; 
syms 'x' 
a = 1; 
b = ((Cc*(x/2+Rp))/(Cc*Cp*Rp*x/2)); 
c = 1/(Cc*Cp*Rp*x/2); 
poles1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); 
poles2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); 

p1_subterm = (exp(-0.3*poles1) - 1)*(z1 - poles1); 
p2_subterm = (exp(-0.3*poles2) - 1)*(z1- poles2); 
f(x) = (1/(poles2 - poles1))*p2_subterm - p2_subterm - 0.04;   
df = diff(f); 
while i <= N 
p = p0-(f(p0)/df(p0)) 
if (abs(p - p0)/abs(p)) < error 
fprintf('Solution is %f \n', double(p)) 
return 
end 
i = i + 1; 
p0 = p; 
end 
fprintf('Solution did not converge within %d iterations \n', N) 
+0

Je ne comprends pas la contrainte. Ne manque-t-il pas un opérateur relationnel (comme '=, <=, > = '; btw, la première ligne n'est pas une équation non plus parce qu'il manque' = ')? La contrainte est-elle plutôt une fonction et vous voulez trouver la racine de la fonction? Si oui, quel est l'argument de la fonction? Je ne vois que des constantes. Si je vous comprends bien, p1 et p2 sont aussi constants car ils sont définis comme racines de la première fonction. Quelle est la différence entre * x * et * unknown * dans la première ligne? –

+0

L'équation est mise à jour. Vous pouvez cliquer sur le lien EquationImage. Les deux équations correspondent à zéro. p1 et p2 sont les racines de l'équation quadratique. Supposons que dans une équation quadratique ax^2 + bx + c, disons que b est inconnu. La même chose est avec mon cas où je dis inconnu dans la première ligne. C'est pourquoi p1 et p2 sont exprimés avec unknown dans ma contrainte. Je veux trouver l'inconnu à travers ma contrainte. –

+0

Votre équation n'est pas claire. x et inconnues; toutes ces constantes peuvent être combinées. C'est un mauvais visuel. Qu'attendez-vous de sortir de cette équation? Valeurs pour x et l'inconnu où les racines sont nulles et la contrainte est satisfaite? La méthode de Newton pour les racines d'une seule équation est une chose; Les solutions itératives de Newton-Raphson des ensembles d'équations en sont une autre. Qu'essayez-vous de faire? – duffymo

Répondre

-1

Je ne pense pas que votre code pour f(x) correspond à l'équation ci-dessus: Dans le code Matlab 1/(poles2-poles1) multiplie les deux exp((...)poles2) et exp((...)poles1) termes et vous avez 1/(c1*c2) - poles1 au lieu de c1*c2 - poles1.

Je n'ai pas vérifié les termes poles1 et poles2 car je trouve les 10 ensembles de parenthèses intimidants. Il serait suggéré de rendre votre code plus lisible en décomposant chacune de ces équations en plusieurs lignes plus courtes et plus claires.

Notant que nous pouvons multiplier le second degré par c1*c2*c3*unknown,

(c1*c2*c3*unknown)*x^2 + x*2*(c1*unknown/2 + C1*c2) + 2 = 0 

alors vous pouvez écrire le code poles et f comme

% Here unknown is x 
syms 'x' 
a = c1*c2*c3*x; 
b = c1*x + 2*c1*c2; 
c = 2; 
poles1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); 
poles2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); 

p1_subterm = (exp(-0.3*poles1) - 1)*(c1*c2 - poles1); 
p2_subterm = (exp(-0.3*poles2) - 1)*(c1*c2 - poles2); 
f(x) = (1/(poles2 - poles1))*p2_subterm - p2_subterm - 0.04; 
+0

@ Steve- J'ai travaillé sur mon code comme vous l'avez indiqué mais cela ne résout pas le problème. Il se fige après 3 itérations. Le code est mis à jour ci-dessus. –

+0

@ Steve le code MATLAB 1/(poles2-poles1) multiplie les deux exp ((...) pôles2) .---- C'est ce que je veux. La contrainte d'équation le dit également. L'idée est de trouver le 'gars inconnu' ici 'x' qui rencontrerait la contrainte. –

+0

@SoumyajyotiMaji Comment gèle-t-il? Qu'y a-t-il à propos de la quatrième itération qui provoque son blocage? Pouvez-vous l'exécuter pour les itérations 1, 2 et 3 avec un profileur et voir si une partie du code prend une durée exponentielle? – Steve