% calcolo degli zeri di f(x)=0 in [a b] % se f(x) รจ continua in [a b] e f(a)*f(b)<0, allora eseiste in [a b] almeno % uno zero di f(X) clear all close all % approccio diretto definisco f(x) in [a b] % calcolo il segno di f(x) a=-8; b =8; n=1000; x=linspace(a,b,n); f= @(x) log(x.^-2+1)-x; %f= @(x) (exp(x)-1).^(-0.5)-x; %f= @(x) cos(x); segnoDi_f=sign(f(x)); %utilizzo diff(segno) per verificare se il segno di f cambia variazioneDiSegno=diff(sign(f(x)))/2; numeroDiZeri=sum(abs(variazioneDiSegno)); if numeroDiZeri > 0 k=find(variazioneDiSegno~=0); figure (1) hold on plot(x,zeros(n),x,f(x)) grid legend('y = 0', 'y = f(x)'); xlabel('x-axis'); ylabel('y-axis'); axis([a b min(f(x)) max(f(x))]) title('y = 0 and y = f(x)'); hold off figure (2) subplot(2,1,1) hold on plot(x,segnoDi_f) grid xlabel('x-axis'); ylabel('y-axis'); axis([a b -2 2]) title('y = sign(f(x))'); hold off figure (2) subplot(2,1,2) hold on plot(x(1:end-1),variazioneDiSegno) grid on xlabel('x-axis'); ylabel('y-axis'); axis([a b -2 2]); title('y = diff(sign(f(x)))'); hold off xk=x(k); f(xk); xkmeno1=x(k-1); f(xkmeno1); xkpiu1=x(k+1); f(xkpiu1); xeps=[xkmeno1 xk xkpiu1]; figure(3) title('Zero di f e dintorni'); plot(x,zeros(n),'b',xeps,zeros(length(xeps)),'bo',xeps,f(xeps),'r*') axis([min(xeps)*0.99 max(xeps)*1.01 min(f(xeps))*1.1 max(f(xeps))*1.1]) xlabel('x-axis'); ylabel('y-axis'); grid on fprintf("numero di zeri di f(x): %d\n",numeroDiZeri) fprintf("Zeri di f(x) nell'intervallo [%d %d]\n",a,b); disp(xk); else fprintf("f(x) non ha zeri in [%d %d]",a,b) end