SlideShare uma empresa Scribd logo
1 de 12
Método Quase-Newton
O método Quase-Newton é baseado em regras recursivas para formação de
uma matriz Hessiana (Hk) que é correspondente a uma estimativa de sua inversa.
‘Deve-se ter em mente que é obrigatório a matriz Hk seja sempre positiva.
Com as características citadas anteriormente foram definidos dois métodos
eficientes: DFP (Davidon-Fletcher-Powell) e o método BFGS (Broyden-Fletcher-
Goldfarb-Shanno) em homenagem aos seus formuladores. Existe, no entanto, uma
conexão entre esses dois métodos e criou-se então a Família de Broyden que contém
os dois métodos agrupados.
Método DFP
Observa-se o método DFP a seguir:
𝐶 𝑘
𝐷𝐹𝑃
= (𝑣 𝑘 𝑣 𝑘′/ 𝑣′ 𝑘 𝑟𝑘) – (𝐻 𝑘 𝑟𝑘 𝑟′ 𝑘 𝐻𝑘 /𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘)
Método BFGS
O método BFGS é mostrado abaixo:
𝐶 𝑘
𝐵𝐹𝐺𝑆
= (1 + (𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘/𝑟′ 𝑘 𝑣 𝑘) *
(𝑣 𝑘 𝑣 𝑘′)
(𝑣′
𝑘 𝑟 𝑘)
-
(( 𝑣 𝑘 𝑟′
𝑘 𝐻 𝑘)+ ( 𝐻 𝑘 𝑟𝑘 𝑣′
𝑘))
(𝑟′
𝑘 𝑣 𝑘)⁄
Família de Broyden
No método de Broyden utiliza-se uma correção dada por:
𝐶 𝑘 = (1 – α) 𝐶 𝑘
𝐷𝐹𝑃
+ α𝐶 𝑘
𝐵𝐹𝐺𝑆
No entanto, deve-se utilizar a fórmula para a estimativa da inversa da
Hessiana:
𝐻 𝑘+1 = 𝐻 𝑘 + 𝐶 𝑘 (α)
Enquanto α = 0 teremos o método de DFP e quando α = 1 teremos o método
BFGS.
Código Algoritmo Quase-Newton em Matlab
% Entradas:
% (1) A dimensionalidade dafunçãode múltiplasvariáveis.
% (2) Funçãono formatoadequado.
% OBS -> Nota:Por favor,garantirque a função inseridaestáno formatolegível peloMATLAB.
Este é o únicopontoem que há possibilidade de erromáximo.
% (3) vetorde aproximaçãoinicial.
% Nota:Garanta que a dimensionalidadecoincidecomdimensãode vetorde
aproximaçãoinicial.
% (4) Erro de tolerância
disp('Gostariade limparoseuespaçode trabalhode memóriae telade comando?');
z=input('Parafazerissodigite 1,qualqueroutronúmeroparacontinuar:');
if z==1
clc;clear
end
escolha=input('Parafazerumamaximizaçãoinserir1,para a minimizaçãodigite2:');a=2; %
coeficientea,dafunção;
while a==2
if escolha~=1&&escolha~=2
disp('Entradaerrada');a=2;
escolha=input('Parafazeramaximixaçãodigite 1,paraminimizardigite 2:');
else
a=1;
end
end
a=2;mark=0;flag=0;count=0;symsb;u=[];warningoff all
try
while a==2
n=floor(input('digiteadimensãodafunçaõ:'));
if n<1
disp('Porvafordigite uminteiropositivo');a=2;
else
a=1;
end
end
catch
disp('Porfavordigite uminteiropositivo');
end
a=2;
for i=1:n
syms(['x' num2str(i)]);
end
while a==2
try
f=input('Digite afunçãoemtermosde variáveisx_i (ouseja,x1,x2,etc.)');a=1;
catch
disp('Porfavor,volte averificaroíndice de variáveise formatode expressão!');a=2;
end
end
if escolha==1
f=-f;
end
x0=(input('Digite aaproximaçãovetorlinhainicial de variáveis:'));a=2;
while a==2
if length(x0)~=n
disp('A dimensãodaaproximaçãoinicialé incorreto!');a=2;
x0=(input('Digiteaaproximaçãoinicial comovetorlinhade variaveis'));
else
a=1;
end
end
try
eps=abs(input('Digite umerrode tolerancia'));
catch
disp('Digite umnúmeroreal!');
end
g=f;
try
for i=1:n
h(i)=diff(g,['x'num2str(i)]);
forj=1:n
k(i,j)=diff(h(i),['x'num2str(j)]);
end
end
catch
disp('Seuproblemade otimizaçãonãopode serresolvido');
return
end
disp('MatrizHessianadafunção=')
if escolha==1
disp(-k)
elseif escolha==2
disp(k)
end
for i=1:n
for j=1:n
if i==j
d=det(-k(1:i,1:j));
if escolha==1
d=-d;
end
SOL=solve(d);
if str2num(char(d))<=0
mark=mark+1;u=[u i];
elseif isempty(SOL)==0
for m=1:length(SOL)
if isreal(SOL(m))==1||isa(SOL(m),'sym')
mark=mark+1;
if (isempty(find(u==i,1)))
u=[ui];
end
end
end
end
end
end
end
if mark>0
if escolha==1
fprintf('nO%gthmenorprincipal daHessiananãoé negativoparatoda reta real x!n',u);
fprintf('Entãoafunçãonãoé côncava globalmente,assimamaximizaçãonãoé
garantida!n');
elseif escolha==2
fprintf('nThe %gthmenorprincipal da Hessiananãoé positivoemtodaretareal x!n',u);
fprintf('Entãoafunção nãoé convexaglobalmente,e assimaminimizaçãoglobal nãoé
garantida!n');
end
else
if escolha==1
fprintf('nTodososmenoresprincipaisdaHessianasãonegativos,entãoafunçãoé
côncava globalmente!n');
disp('Assimamaximizaçãoglobal é possível!');
elseif escolha==2
fprintf('nTodososmenoresprincipaisdasHessianasãopositivos,assimafunçãoé
convexaglobalmente!n');
disp('Assimaminimizaçãoglobalé possível!');
end
end
X=x0;
if mark>0
S=eye(n);
else
S=k;
for i=1:n
S=(subs(S,['x'num2str(i)],X(i)));
end
end
%S=input('Digite umamatrizdefinidapositiva');
if n==2
A=[];B=[];C=f;
end
while flag~=1
count=count+1;steplength=0;
grad=h';fprintf('n-------------------------%gthIteração------------------nnn',count) % gth,
significan-ésimaposiçãoouposição;
if n==2
A=[A X(1)];B=[BX(2)];
end
for i=1:n
grad=subs(grad,['x'num2str(i)],X(i));
end
disp('pontoatual:');disp(X);
disp('Gradiente=');
if escolha==1
disp(-grad)
elseif escolha==2
disp(grad)
end
if max(abs(grad))>eps
fprintf('nA tolerânciade erroque você forneceunãofoi alcançadoaindan');
flag=input('Paraterminardigite1,senãooutronumeropara continuar:');
end
if flag==1
hes=k;
fori=1:n
hes=subs(hes,['x'num2str(i)],X(i));
end
fprintf('nn..........Resultado...........nn')
if length(find(eig(hes)>0))==length(eig(hes))
disp('Nopontoatual afunção é convexaentãoeladevaserum minimolocal !');
elseiflength(find(eig(hes)<0))==length(eig(hes))
disp('Nopontoatual afunção é concava assimeladevaseruma maximolocal');
else
disp('OPontoatual nãoé um EXTREMO local (pontocrítico)!');
end
disp('Atualmente,amatriz hessianaé:');
if escolha==1
disp(-hes)
elseifescolha==2
disp(hes)
end
fprintf('Opontoótimoem%gthoerroé:n',max(abs(grad)));
disp(X);
fori=1:n
f=subs(f,['x'num2str(i)],X(i));
end
fprintf('ne ovalordafunçãoaqui é:n');
if escolha==1
disp(-f)
elseifescolha==2
disp(f)
end
fprintf('Onúmerototal de iteraçõesrealizada=%gn',count);
end
if max(abs(grad))<=eps
fprintf('nnA tolerânciade erroque você forneceufoi alcançado.n');
hes=k;
fori=1:n
hes=subs(hes,['x'num2str(i)],X(i));
end
fprintf('nn..........Resultado...........nn')
if length(find(eig(hes)>0))==length(eig(hes))
disp('Alémdisso,nopresente momento,afunção é convexaporissopode serum
mínimolocal !');
elseiflength(find(eig(hes)<0))==length(eig(hes))
disp('Alémdisso,nopresente momento,afunçãoé côncava de modoque pode serum
máximolocal !');
else
disp('No entanto,opresentepontonãoé um pontoextremolocal !');
end
disp('Atualmente amatrizhesseanaé:');
if escolha==1
disp(-hes)
elseifescolha==2
disp(hes)
end
fprintf('Opontootimo em%gOerro é:n',max(abs(grad)));
disp(X);
fori=1:n
f=subs(f,['x'num2str(i)],X(i));
end
fprintf('nEaqui ovalorda funçãoé:n');
if escolha==1
disp(-f)
elseifescolha==2
disp(f)
end
fprintf('Onúmerototal de iteraçõesrealizada=%gn',count);flag=1;
elseif max(abs(grad))>eps&&flag~=1
fun=f;dir=-S*grad;
fori=1:n
fun=subs(fun,['x'num2str(i)],X(i)+b*dir(i));
end
diff(fun,b);
d=solve(diff(fun,b));
if isempty(d)==1
steplength=1;
else
t=double(d);
dd=diff(diff(fun,b));
fori=1:length(t)
if isreal(t(i))==1
if subs(dd,'b',t(i))>0
steplength=t(i);break
end
end
end
if steplength==0
for i=1:length(t)
if isreal(t(i))==1
if t(i)>0
steplength=t(i);break
end
end
end
end
if steplength==0
steplength=1;
end
end
funct=f;
fori=1:n
funct=subs(funct,['x'num2str(i)],X(i));
end
disp('Valorfuncional(dafunção) atualmente=');
if escolha==1
disp(-funct)
elseifescolha==2
disp(funct)
end
disp('Tamanhodopassotomado=');disp(steplength);
X=X+steplength*dir;p=steplength*dir;
grad_new=h';
fori=1:n
grad_new=subs(grad_new,['x'num2str(i)],X(i));
end
q=grad_new-grad;
S=S-(S*q*q'*S)/(q'*S*q)+(p*p')/(p'*q);
if count>100
disp('Você jádeve terfeito100iteraçõese parece que nenhumextremodafunção
existe!');
flag=input('Érecomendável paravocê encerraro processo,afazê-lo,digitando1,ou
qualqueroutronúmeroparacontinuar:');
end
end
end
try
if n==2&&length(A)>=2
[a,b]=meshgrid(A,B);C=subs(C,{x1,x2},{a,b});
view([-50,30]);axistight;holdon
surfc(a,b,C,'facecolor','green','edgecolor','b','facelighting','gouraud')
view([-50,30]);axistight;shadinginterp;
plot(A,B,'-mo',...
'LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[.491 .63],...
'MarkerSize',12);
end
catch
disp('Nãofoi possível geraro"plot"de função(plotara função) !');
end

Mais conteúdo relacionado

Destaque

A simplex nelder mead genetic algorithm for minimizing molecular potential en...
A simplex nelder mead genetic algorithm for minimizing molecular potential en...A simplex nelder mead genetic algorithm for minimizing molecular potential en...
A simplex nelder mead genetic algorithm for minimizing molecular potential en...Aboul Ella Hassanien
 
Optimization In R
Optimization In ROptimization In R
Optimization In Rsyou6162
 
Comparative study of algorithms of nonlinear optimization
Comparative study of algorithms of nonlinear optimizationComparative study of algorithms of nonlinear optimization
Comparative study of algorithms of nonlinear optimizationPranamesh Chakraborty
 
Nelder Mead Search Algorithm
Nelder Mead Search AlgorithmNelder Mead Search Algorithm
Nelder Mead Search AlgorithmAshish Khetan
 
H2O World - GLM - Tomas Nykodym
H2O World - GLM - Tomas NykodymH2O World - GLM - Tomas Nykodym
H2O World - GLM - Tomas NykodymSri Ambati
 
Simulated annealing.ppt
Simulated annealing.pptSimulated annealing.ppt
Simulated annealing.pptKaal Nath
 
Using Gradient Descent for Optimization and Learning
Using Gradient Descent for Optimization and LearningUsing Gradient Descent for Optimization and Learning
Using Gradient Descent for Optimization and LearningDr. Volkan OBAN
 
Simulated Annealing - A Optimisation Technique
Simulated Annealing - A Optimisation TechniqueSimulated Annealing - A Optimisation Technique
Simulated Annealing - A Optimisation TechniqueAUSTIN MOSES
 
Simulated Annealing
Simulated AnnealingSimulated Annealing
Simulated AnnealingJoy Dutta
 
Simulated annealing -a informative approach
Simulated annealing -a informative approachSimulated annealing -a informative approach
Simulated annealing -a informative approachRanak Ghosh
 

Destaque (11)

A simplex nelder mead genetic algorithm for minimizing molecular potential en...
A simplex nelder mead genetic algorithm for minimizing molecular potential en...A simplex nelder mead genetic algorithm for minimizing molecular potential en...
A simplex nelder mead genetic algorithm for minimizing molecular potential en...
 
Optimization In R
Optimization In ROptimization In R
Optimization In R
 
Comparative study of algorithms of nonlinear optimization
Comparative study of algorithms of nonlinear optimizationComparative study of algorithms of nonlinear optimization
Comparative study of algorithms of nonlinear optimization
 
Nelder Mead Search Algorithm
Nelder Mead Search AlgorithmNelder Mead Search Algorithm
Nelder Mead Search Algorithm
 
CV TKD
CV TKDCV TKD
CV TKD
 
H2O World - GLM - Tomas Nykodym
H2O World - GLM - Tomas NykodymH2O World - GLM - Tomas Nykodym
H2O World - GLM - Tomas Nykodym
 
Simulated annealing.ppt
Simulated annealing.pptSimulated annealing.ppt
Simulated annealing.ppt
 
Using Gradient Descent for Optimization and Learning
Using Gradient Descent for Optimization and LearningUsing Gradient Descent for Optimization and Learning
Using Gradient Descent for Optimization and Learning
 
Simulated Annealing - A Optimisation Technique
Simulated Annealing - A Optimisation TechniqueSimulated Annealing - A Optimisation Technique
Simulated Annealing - A Optimisation Technique
 
Simulated Annealing
Simulated AnnealingSimulated Annealing
Simulated Annealing
 
Simulated annealing -a informative approach
Simulated annealing -a informative approachSimulated annealing -a informative approach
Simulated annealing -a informative approach
 

Cap 4 parte_elizabeth

  • 1. Método Quase-Newton O método Quase-Newton é baseado em regras recursivas para formação de uma matriz Hessiana (Hk) que é correspondente a uma estimativa de sua inversa. ‘Deve-se ter em mente que é obrigatório a matriz Hk seja sempre positiva. Com as características citadas anteriormente foram definidos dois métodos eficientes: DFP (Davidon-Fletcher-Powell) e o método BFGS (Broyden-Fletcher- Goldfarb-Shanno) em homenagem aos seus formuladores. Existe, no entanto, uma conexão entre esses dois métodos e criou-se então a Família de Broyden que contém os dois métodos agrupados. Método DFP Observa-se o método DFP a seguir: 𝐶 𝑘 𝐷𝐹𝑃 = (𝑣 𝑘 𝑣 𝑘′/ 𝑣′ 𝑘 𝑟𝑘) – (𝐻 𝑘 𝑟𝑘 𝑟′ 𝑘 𝐻𝑘 /𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘) Método BFGS O método BFGS é mostrado abaixo: 𝐶 𝑘 𝐵𝐹𝐺𝑆 = (1 + (𝑟′ 𝑘 𝐻 𝑘 𝑟𝑘/𝑟′ 𝑘 𝑣 𝑘) * (𝑣 𝑘 𝑣 𝑘′) (𝑣′ 𝑘 𝑟 𝑘) - (( 𝑣 𝑘 𝑟′ 𝑘 𝐻 𝑘)+ ( 𝐻 𝑘 𝑟𝑘 𝑣′ 𝑘)) (𝑟′ 𝑘 𝑣 𝑘)⁄ Família de Broyden No método de Broyden utiliza-se uma correção dada por: 𝐶 𝑘 = (1 – α) 𝐶 𝑘 𝐷𝐹𝑃 + α𝐶 𝑘 𝐵𝐹𝐺𝑆 No entanto, deve-se utilizar a fórmula para a estimativa da inversa da Hessiana: 𝐻 𝑘+1 = 𝐻 𝑘 + 𝐶 𝑘 (α) Enquanto α = 0 teremos o método de DFP e quando α = 1 teremos o método BFGS.
  • 2. Código Algoritmo Quase-Newton em Matlab % Entradas: % (1) A dimensionalidade dafunçãode múltiplasvariáveis. % (2) Funçãono formatoadequado. % OBS -> Nota:Por favor,garantirque a função inseridaestáno formatolegível peloMATLAB. Este é o únicopontoem que há possibilidade de erromáximo. % (3) vetorde aproximaçãoinicial. % Nota:Garanta que a dimensionalidadecoincidecomdimensãode vetorde aproximaçãoinicial. % (4) Erro de tolerância disp('Gostariade limparoseuespaçode trabalhode memóriae telade comando?'); z=input('Parafazerissodigite 1,qualqueroutronúmeroparacontinuar:'); if z==1 clc;clear end escolha=input('Parafazerumamaximizaçãoinserir1,para a minimizaçãodigite2:');a=2; % coeficientea,dafunção; while a==2 if escolha~=1&&escolha~=2 disp('Entradaerrada');a=2; escolha=input('Parafazeramaximixaçãodigite 1,paraminimizardigite 2:'); else a=1; end end a=2;mark=0;flag=0;count=0;symsb;u=[];warningoff all try while a==2
  • 3. n=floor(input('digiteadimensãodafunçaõ:')); if n<1 disp('Porvafordigite uminteiropositivo');a=2; else a=1; end end catch disp('Porfavordigite uminteiropositivo'); end a=2; for i=1:n syms(['x' num2str(i)]); end while a==2 try f=input('Digite afunçãoemtermosde variáveisx_i (ouseja,x1,x2,etc.)');a=1; catch disp('Porfavor,volte averificaroíndice de variáveise formatode expressão!');a=2; end end if escolha==1 f=-f; end x0=(input('Digite aaproximaçãovetorlinhainicial de variáveis:'));a=2; while a==2 if length(x0)~=n
  • 4. disp('A dimensãodaaproximaçãoinicialé incorreto!');a=2; x0=(input('Digiteaaproximaçãoinicial comovetorlinhade variaveis')); else a=1; end end try eps=abs(input('Digite umerrode tolerancia')); catch disp('Digite umnúmeroreal!'); end g=f; try for i=1:n h(i)=diff(g,['x'num2str(i)]); forj=1:n k(i,j)=diff(h(i),['x'num2str(j)]); end end catch disp('Seuproblemade otimizaçãonãopode serresolvido'); return end disp('MatrizHessianadafunção=') if escolha==1 disp(-k) elseif escolha==2
  • 5. disp(k) end for i=1:n for j=1:n if i==j d=det(-k(1:i,1:j)); if escolha==1 d=-d; end SOL=solve(d); if str2num(char(d))<=0 mark=mark+1;u=[u i]; elseif isempty(SOL)==0 for m=1:length(SOL) if isreal(SOL(m))==1||isa(SOL(m),'sym') mark=mark+1; if (isempty(find(u==i,1))) u=[ui]; end end end end end end end if mark>0 if escolha==1
  • 6. fprintf('nO%gthmenorprincipal daHessiananãoé negativoparatoda reta real x!n',u); fprintf('Entãoafunçãonãoé côncava globalmente,assimamaximizaçãonãoé garantida!n'); elseif escolha==2 fprintf('nThe %gthmenorprincipal da Hessiananãoé positivoemtodaretareal x!n',u); fprintf('Entãoafunção nãoé convexaglobalmente,e assimaminimizaçãoglobal nãoé garantida!n'); end else if escolha==1 fprintf('nTodososmenoresprincipaisdaHessianasãonegativos,entãoafunçãoé côncava globalmente!n'); disp('Assimamaximizaçãoglobal é possível!'); elseif escolha==2 fprintf('nTodososmenoresprincipaisdasHessianasãopositivos,assimafunçãoé convexaglobalmente!n'); disp('Assimaminimizaçãoglobalé possível!'); end end X=x0; if mark>0 S=eye(n); else S=k; for i=1:n S=(subs(S,['x'num2str(i)],X(i))); end end
  • 7. %S=input('Digite umamatrizdefinidapositiva'); if n==2 A=[];B=[];C=f; end while flag~=1 count=count+1;steplength=0; grad=h';fprintf('n-------------------------%gthIteração------------------nnn',count) % gth, significan-ésimaposiçãoouposição; if n==2 A=[A X(1)];B=[BX(2)]; end for i=1:n grad=subs(grad,['x'num2str(i)],X(i)); end disp('pontoatual:');disp(X); disp('Gradiente='); if escolha==1 disp(-grad) elseif escolha==2 disp(grad) end if max(abs(grad))>eps fprintf('nA tolerânciade erroque você forneceunãofoi alcançadoaindan'); flag=input('Paraterminardigite1,senãooutronumeropara continuar:'); end if flag==1 hes=k; fori=1:n
  • 8. hes=subs(hes,['x'num2str(i)],X(i)); end fprintf('nn..........Resultado...........nn') if length(find(eig(hes)>0))==length(eig(hes)) disp('Nopontoatual afunção é convexaentãoeladevaserum minimolocal !'); elseiflength(find(eig(hes)<0))==length(eig(hes)) disp('Nopontoatual afunção é concava assimeladevaseruma maximolocal'); else disp('OPontoatual nãoé um EXTREMO local (pontocrítico)!'); end disp('Atualmente,amatriz hessianaé:'); if escolha==1 disp(-hes) elseifescolha==2 disp(hes) end fprintf('Opontoótimoem%gthoerroé:n',max(abs(grad))); disp(X); fori=1:n f=subs(f,['x'num2str(i)],X(i)); end fprintf('ne ovalordafunçãoaqui é:n'); if escolha==1 disp(-f) elseifescolha==2 disp(f) end
  • 9. fprintf('Onúmerototal de iteraçõesrealizada=%gn',count); end if max(abs(grad))<=eps fprintf('nnA tolerânciade erroque você forneceufoi alcançado.n'); hes=k; fori=1:n hes=subs(hes,['x'num2str(i)],X(i)); end fprintf('nn..........Resultado...........nn') if length(find(eig(hes)>0))==length(eig(hes)) disp('Alémdisso,nopresente momento,afunção é convexaporissopode serum mínimolocal !'); elseiflength(find(eig(hes)<0))==length(eig(hes)) disp('Alémdisso,nopresente momento,afunçãoé côncava de modoque pode serum máximolocal !'); else disp('No entanto,opresentepontonãoé um pontoextremolocal !'); end disp('Atualmente amatrizhesseanaé:'); if escolha==1 disp(-hes) elseifescolha==2 disp(hes) end fprintf('Opontootimo em%gOerro é:n',max(abs(grad))); disp(X); fori=1:n f=subs(f,['x'num2str(i)],X(i));
  • 10. end fprintf('nEaqui ovalorda funçãoé:n'); if escolha==1 disp(-f) elseifescolha==2 disp(f) end fprintf('Onúmerototal de iteraçõesrealizada=%gn',count);flag=1; elseif max(abs(grad))>eps&&flag~=1 fun=f;dir=-S*grad; fori=1:n fun=subs(fun,['x'num2str(i)],X(i)+b*dir(i)); end diff(fun,b); d=solve(diff(fun,b)); if isempty(d)==1 steplength=1; else t=double(d); dd=diff(diff(fun,b)); fori=1:length(t) if isreal(t(i))==1 if subs(dd,'b',t(i))>0 steplength=t(i);break end end end
  • 11. if steplength==0 for i=1:length(t) if isreal(t(i))==1 if t(i)>0 steplength=t(i);break end end end end if steplength==0 steplength=1; end end funct=f; fori=1:n funct=subs(funct,['x'num2str(i)],X(i)); end disp('Valorfuncional(dafunção) atualmente='); if escolha==1 disp(-funct) elseifescolha==2 disp(funct) end disp('Tamanhodopassotomado=');disp(steplength); X=X+steplength*dir;p=steplength*dir; grad_new=h'; fori=1:n
  • 12. grad_new=subs(grad_new,['x'num2str(i)],X(i)); end q=grad_new-grad; S=S-(S*q*q'*S)/(q'*S*q)+(p*p')/(p'*q); if count>100 disp('Você jádeve terfeito100iteraçõese parece que nenhumextremodafunção existe!'); flag=input('Érecomendável paravocê encerraro processo,afazê-lo,digitando1,ou qualqueroutronúmeroparacontinuar:'); end end end try if n==2&&length(A)>=2 [a,b]=meshgrid(A,B);C=subs(C,{x1,x2},{a,b}); view([-50,30]);axistight;holdon surfc(a,b,C,'facecolor','green','edgecolor','b','facelighting','gouraud') view([-50,30]);axistight;shadinginterp; plot(A,B,'-mo',... 'LineWidth',2,... 'MarkerEdgeColor','k',... 'MarkerFaceColor',[.491 .63],... 'MarkerSize',12); end catch disp('Nãofoi possível geraro"plot"de função(plotara função) !'); end