% calcolo della soluzione dell'equazione f(x)=x nell'intervallo [a b] % se g(x)=f(x)-x è continua in [a b] e g(a)*g(b)<0, allora eseiste in [a b] % almeno uno zero di g(X), quindi almeno una soluzione dell'equazione % f(x)=x % utilizziamo il metodo iterativo clear all close all format long a=0; b = 2; n=1000; maxIterazioni=1000; maxErrore=100*eps; x=linspace(a,b,n); dx=x(2)-x(1); y1=x; %f= @(x) log(x.^-2+1); f= @(x) (exp(x)-1).^(-0.5); g= @(x) f(x)-x; if g(a).*g(b)<=0 df_su_dx= @(x) diff(f(x))./dx; %calcolo della derivata di f(x) indice_x0=find(diff(sign(f(x)-x))~=0) figure (1) hold on plot(x,y1,x,f(x)) grid on %legend('y = x', 'y = exp(x)-1) .^ -1/2 '); xlabel('x-axis'); ylabel('y-axis'); axis([a b 0 4]) title("Plot di y = x and y = f(x)"); hold off figure (2) hold on plot(x(1:length(df_su_dx(x))),abs(df_su_dx(x)),x,ones(n)) grid on %legend('y = 1', "y = f'(x)"); xlabel('x-axis'); ylabel('y-axis'); axis([a b 0 4]) title("Plot di y = 1 and y = f'(x)"); hold off x0=(a+b)/2; errore=1; u(1)=f(x0); k=2; while (errore>maxErrore) %for k=1:100 % abs(errore) > 0.2 x0=f(x0); u(k)=f(x0); errore=abs(u(k)-u(k-1)); k=k+1; if k>maxIterazioni break end end if k>maxIterazioni fprintf("Esiste almenno una soluzione x0 in [%d %d]\n",a,b) fprintf("ma è stato raggiunto in numero massimo di iterazioni %d senza convergenza\n",k); fprintf("Verificare che |f'(x)|<1 in [a b], eventualmente sceglere un intervallo più piccolo\n"); fprintf("N.B. Se |f'(x)|>1 in un intorno di x0 la successione f(x_k+1)=x_k non converge\n"); fprintf("e quindi l'equazione non può essere risolta con il metodo iterativo.\n"); fprintf("Provare, se è possibile, a scrivere l'equazione in una altra forma\n"); fprintf("oppure utilizzare un metodo di calcolo diverso.\n"); else x0=u(end); fprintf("Soluzione di f(x)=x nell'intervallo [%d %d] è: %d\n",a,b,x0); fprintf("Soluzione trovata dopo %d iterazioni\n",k); fprintf("errore %d\n",errore); end else fprintf("l'equazione f(x)=x non ha soluzioni nell'intervallo [%d %d]\n",a,b); end