Càlcul dels zeros d'una funció:

En aquesta pràctica veurem com es poden calcular numèricament els zeros d'una funció.

Teorema de Bolzano: Canvis de signe

Donada una funció f(x), per calcular els seus zeros haurem de fer:
% funció f(x) definida com a inline
f=@(x) sin(x);
%rang de valors que estudiem
xmin=-5;
xmax=5;
pas=0.15;
x=xmin:pas:xmax;
%valors de la funció
y=f(x);
 
%-------------------------------------------------------------
% pintem la funció per tenir una idea dels zeros
%-------------------------------------------------------------
semieix_y=1.1*max(abs(y)); %ajustem els eixos als valors de la funció
plot(x,y,'.-');
hold on;
axis([xmin xmax -semieix_y semieix_y]);
grid
line([xmin xmax],[0 0],'Color','k','LineWidth',2)
line([0 0],[-semieix_y semieix_y],'Color','k','LineWidth',2)

Determinació de l'interval de canvi de signe

%-------------------------------------------------------------
% Determinem els possibles zeros de la funció.
%-------------------------------------------------------------
%
% Fem un estudi del numero de zeros a partir dels canvis de signe de la
% funció
 
nzeros=0;
intervals=[];
for j=1:length(y)-1
if ( y(j)*y(j+1) <= 0 )
nzeros=nzeros+1;
plot(x(j),y(j),'ro')
plot(x(j+1),y(j+1),'yd')
disp(['zero ', num2str(nzeros)]);
disp(['interval [' num2str(x(j)) ',' num2str(x(j+1)) ']']);
intervals=[intervals; x(j), x(j+1)]; %guardem els intervals en una matriu
end
end
zero 1
interval [-3.2,-3.05]
zero 2
interval [-0.05,0.1]
zero 3
interval [3.1,3.25]

Mètode de la Bisecció

Es basa en dividir succesivament la meitat l'interval inicial [a,b], en el que hi ha un canvi de signe i anar descartant la meitat que ja no conté el canvi de signe (trobareu el codi al final del guió).
Iteracions de la bisecció

Càlcul del zero a cada interval

Ara per cada interval cridarem una funció que calculi el zero fins a una determinada tolerància d'error . Aquest criteri és suficient si la funció és prou vertical però en general és més precís utilitzar que que sempre donarà un valor més proper al zero real.
tol = 1.e-8; % demanem 10^(-8) de precisió en el càlcul
numZeros = size(intervals,1); %cada fila és un interval [xa, xb] de canvi de signe
for i = 1:numZeros
xa = intervals(i,1);
xb = intervals(i,2);
z(i) = biseccio(f, xa, xb, tol); %s'ha de triar el mètode a utilitzar
%z(i) = secant(f, xa, xb, tol);
%z(i) = newton(f, df, xa, xb, tol);
end
iter = 1 x= -3.1250000000000000e+00 f(x)= -1.659189e-02 iter = 2 x= -3.1625000000000001e+00 f(x)= 2.090582e-02 iter = 3 x= -3.1437499999999998e+00 f(x)= 2.157345e-03 iter = 4 x= -3.1343749999999999e+00 f(x)= -7.217591e-03 iter = 5 x= -3.1390624999999996e+00 f(x)= -2.530151e-03 iter = 6 x= -3.1414062499999997e+00 f(x)= -1.864036e-04 iter = 7 x= -3.1425781250000000e+00 f(x)= 9.854713e-04 iter = 8 x= -3.1419921874999996e+00 f(x)= 3.995339e-04 iter = 9 x= -3.1416992187499995e+00 f(x)= 1.065652e-04 iter = 10 x= -3.1415527343749998e+00 f(x)= -3.991921e-05 iter = 11 x= -3.1416259765624996e+00 f(x)= 3.332297e-05 iter = 12 x= -3.1415893554687497e+00 f(x)= -3.298121e-06 iter = 13 x= -3.1416076660156245e+00 f(x)= 1.501243e-05 iter = 14 x= -3.1415985107421873e+00 f(x)= 5.857152e-06 iter = 15 x= -3.1415939331054688e+00 f(x)= 1.279516e-06 iter = 16 x= -3.1415916442871090e+00 f(x)= -1.009303e-06 iter = 17 x= -3.1415927886962889e+00 f(x)= 1.351065e-07 iter = 18 x= -3.1415922164916990e+00 f(x)= -4.370981e-07 iter = 19 x= -3.1415925025939941e+00 f(x)= -1.509958e-07 iter = 20 x= -3.1415926456451415e+00 f(x)= -7.944652e-09 -------------------------------- iter = 1 x= 2.5000000000000355e-02 f(x)= 2.499740e-02 iter = 2 x= -1.2499999999999734e-02 f(x)= -1.249967e-02 iter = 3 x= 6.2500000000003109e-03 f(x)= 6.249959e-03 iter = 4 x= -3.1249999999997113e-03 f(x)= -3.124995e-03 iter = 5 x= 1.5625000000002998e-03 f(x)= 1.562499e-03 iter = 6 x= -7.8124999999970579e-04 f(x)= -7.812499e-04 iter = 7 x= 3.9062500000029698e-04 f(x)= 3.906250e-04 iter = 8 x= -1.9531249999970440e-04 f(x)= -1.953125e-04 iter = 9 x= 9.7656250000296291e-05 f(x)= 9.765625e-05 iter = 10 x= -4.8828124999704056e-05 f(x)= -4.882812e-05 iter = 11 x= 2.4414062500296117e-05 f(x)= 2.441406e-05 iter = 12 x= -1.2207031249703969e-05 f(x)= -1.220703e-05 iter = 13 x= 6.1035156252960739e-06 f(x)= 6.103516e-06 iter = 14 x= -3.0517578122039478e-06 f(x)= -3.051758e-06 iter = 15 x= 1.5258789065460631e-06 f(x)= 1.525879e-06 iter = 16 x= -7.6293945282894233e-07 f(x)= -7.629395e-07 iter = 17 x= 3.8146972685856038e-07 f(x)= 3.814697e-07 iter = 18 x= -1.9073486298519098e-07 f(x)= -1.907349e-07 iter = 19 x= 9.5367431936684699e-08 f(x)= 9.536743e-08 iter = 20 x= -4.7683715524253140e-08 f(x)= -4.768372e-08 iter = 21 x= 2.3841858206215780e-08 f(x)= 2.384186e-08 iter = 22 x= -1.1920928659018680e-08 f(x)= -1.192093e-08 iter = 23 x= 5.9604647735985499e-09 f(x)= 5.960465e-09 -------------------------------- iter = 1 x= 3.1750000000000007e+00 f(x)= -3.340113e-02 iter = 2 x= 3.1375000000000006e+00 f(x)= 4.092642e-03 iter = 3 x= 3.1562500000000009e+00 f(x)= -1.465682e-02 iter = 4 x= 3.1468750000000005e+00 f(x)= -5.282322e-03 iter = 5 x= 3.1421875000000004e+00 f(x)= -5.948464e-04 iter = 6 x= 3.1398437500000007e+00 f(x)= 1.748903e-03 iter = 7 x= 3.1410156250000005e+00 f(x)= 5.770286e-04 iter = 8 x= 3.1416015625000004e+00 f(x)= -8.908910e-06 iter = 9 x= 3.1413085937500007e+00 f(x)= 2.840598e-04 iter = 10 x= 3.1414550781250004e+00 f(x)= 1.375755e-04 iter = 11 x= 3.1415283203125002e+00 f(x)= 6.433328e-05 iter = 12 x= 3.1415649414062505e+00 f(x)= 2.771218e-05 iter = 13 x= 3.1415832519531257e+00 f(x)= 9.401637e-06 iter = 14 x= 3.1415924072265629e+00 f(x)= 2.463632e-07 iter = 15 x= 3.1415969848632814e+00 f(x)= -4.331273e-06 iter = 16 x= 3.1415946960449221e+00 f(x)= -2.042455e-06 iter = 17 x= 3.1415935516357427e+00 f(x)= -8.980459e-07 iter = 18 x= 3.1415929794311528e+00 f(x)= -3.258414e-07 iter = 19 x= 3.1415926933288576e+00 f(x)= -3.973906e-08 iter = 20 x= 3.1415925502777102e+00 f(x)= 1.033121e-07 iter = 21 x= 3.1415926218032837e+00 f(x)= 3.178651e-08 iter = 22 x= 3.1415926575660706e+00 f(x)= -3.976277e-09 --------------------------------
disp('zeros :');
zeros :
z
z = 1×3
-3.141592645645142e+00 5.960464773598550e-09 3.141592657566071e+00

Exercici 1:

Canvieu el criteri de detecció del zero de bisecció per la condició .
Hint: En aquest cas només cal fer i només calen un parell més d'iteracions.
Agafeu la funció en que és una funció molt plana (tota ella està per sota de ) i mireu la diferència entre els dos criteris (el segon sempre és més precís!!)

Exercici 2: Mètode de la secant (regula falsi)

Implementeu el mètode de la secant creant una funció de Matlab
function zero = secant(f, xa, xb, tol)
i substituiu en el programa anterior la crida a biseccio per la crida a secant.
Mètode de la secant:
Anàlogament al que es fa en el mètode de bisecció, es pot fer el mateix però triant com a punt intermedi c, el punt de tall de l'eix x (y=0) amb la recta que uneix els dos punts (a,f(a)) i (b,fb)).
Podeu comprovar que la fórmula és:
A partir d'aquí es procedeix exactament igual que a bisecció, es descarta el subinterval que no conté el zero.
(source https://planetcalc.com/3712/)
Solució: Pel primer dels zeros només calen dues iteracions i donen:
iter = 1 x= -3.1415994094031583e+00 f(x)= 6.755813e-06
iter = 2 x= -3.1415926532799121e+00 f(x)= -3.098811e-10

Exercici 3: Mètode de Newton

Implementeu el mètode de Newton creant una funció de Matlab
function zero = newton(f, df, a, b, tol)
i substituiu en el programa anterior la crida a biseccio per la crida a newton.
Mètode de Newton:
Anàlogament al que es fa en el mètode de secant, es pot fer el mateix però triant com a punt intermedi c, el punt de tall de l'eix x (y=0) amb la recta tangent en un punt inicial de l'interval [a,b]. Per exemple el punt mig de [a,b], .
Això requereix, entre d'altres coses, el càlcul de la derivada de la funció f(x) i definir-la també com una funció inline.
La fórmula matemàtica del mètode en aquest cas és:
A partir d'aquí es procedeix exactament igual que a bisecció, es descarta el subinterval que no conté el zero.
NewtonIteration_Ani.gif
(source Animation of Newton's method by Ralf Pfeifer (https://commons.wikimedia.org/wiki/File:NewtonIteration_Ani.gif))
% funció f(x) definida com a inline
f=@(x) sin(x);
% Derivada de f(x)
df=@(x) cos(x);
x0=(b-a)/2;
Solució: Pel primer dels zeros només calen dues iteracions i donen:
iter = 1 x= -3.1415941764993582e+00 f(x)= -1.659189e-02
iter = 2 x= -3.1415926535897931e+00 f(x)= -1.224647e-16
Noteu que el valor de f(x) obtingut és molt millor, de l'ordre de en comptes del del mètode de la secant.

Exercici 2: Calcul dels zeros d'una funció

Calculeu els zeros de la funció
dins l'interval [-5,-1.5], pas entre les x de 0.02 i amb una tol = 1.e-10
Solució: Hi ha un total de 7 zeros
-4.7949e+00 -4.4553e+00 -4.0875e+00 -3.6833e+00 -3.2287e+00 -2.6987e+00 -2.0351e+00

Exercicis:(by P. Gutiérrez)

(1) Representeu, a l'interval la gràfica de la funció (en color vermell), i la gràfica del seu polinomi de Taylor de grau 3 a l'origen, (en línia discontínua de color negre), totes dues a la mateixa finestra.
%close all %tanquem figures anteriors (optatiu)
figure %nova figura
hold on %per fer les dues grafiques sobre la mateixa figura
 
f=@(x) sin(x);
p3=@(x) x-x.^3/6;
 
x=-pi:0.01:pi;
y=f(x);
plot(x,y)
y2=p3(x);
plot(x,y2) %tambe podem fer directament "plot(x,y,x,y2)"
(2) Representeu la funció a l'interval , prenent 0.001 com a increment de l'interval d'abscisses Visualment, compteu el nombre de zeros i d'extrems relatius (màxims i mínims) de la funció.
%close all %tanquem figures anteriors (optatiu)
figure %nova figura
hold on
 
f=@(x) log(x.^2-x+2).*cos(x);
 
x=-10:0.001:15;
y=f(x);
plot(x,y)
grid %hi ha 8 zeros, 4 maxims i 4 minims
Sabent que el conjunt de valors tals que és un interval trobeu els valors aproximats de a i
indexs=find( y>=4 );
 
imin=min(indexs);
a=x(imin)
a =
1.195400000000000e+01
 
imax=max(indexs);
b=x(imax)
b =
1.323500000000000e+01
(3) Considereu la funció Representeu, a l'interval la gràfica de prenent un increment h=0.1 en els valors de la variable Localitzeu visualment quants zeros té la funció, i on es troben.
%close all %tanquem figures anteriors (optatiu)
figure %nova figura
hold on
 
f=@(x) 2*sqrt(2*x.^2+x+3)+sin(x.^2+2)-8;
 
h=0.1;
x=-5:h:5;
y=f(x);
plot(x,y)
grid %observem que te 4 zeros
Determineu intervals de longitud h=0.1 on la funció presenti un canvi de signe i, per tant, tingui un zero.
nzeros=0;
intervals=[]; %cada fila de la matriu correspondra a un interval
N=length(x); %nombre de punts
for j=1:N-1
if( y(j)*y(j+1)<=0 )
nzeros=nzeros+1; %nombre de zeros trobats fins ara
intervals=[intervals; x(j),x(j+1)]; %afegim una fila a la matriu
fprintf('interval %d: [%f,%f]\n',nzeros,x(j),x(j+1))
plot(x(j),y(j),'r*') %asterisc vermell a l'esquerra del punt
plot(x(j+1),y(j+1),'go') %cercle verd a la dreta del punt
end
end
interval 1: [-3.200000,-3.100000] interval 2: [-2.700000,-2.600000] interval 3: [-2.500000,-2.400000] interval 4: [2.100000,2.200000]
Calculeu el zero a cadascun dels intervals trobats aplicant el mètode de bisecció amb una tolerància d'error tol=1e-8. Utilitzeu la funció donada al fitxer biseccio.m .
(Primer heu de crear el fitxer biseccio.m , copiant-lo del final del guió i guardant-lo.)
tol=1e-8;
numZeros=size(intervals,1);
%nombre de files i, per tant, d'intervals trobats
for i=1:numZeros
xa=intervals(i,1); %copiem xa i xb d'una fila de la matriu
xb=intervals(i,2);
z(i)=biseccio(f,xa,xb,tol); %anem omplint un vector z amb els zeros
end
iter = 1 x= -3.1499999999999999e+00 f(x)= 2.755143e-01 iter = 2 x= -3.1250000000000000e+00 f(x)= 9.262973e-02 iter = 3 x= -3.1124999999999998e+00 f(x)= 7.965043e-03 iter = 4 x= -3.1062499999999997e+00 f(x)= -3.255253e-02 iter = 5 x= -3.1093750000000000e+00 f(x)= -1.244819e-02 iter = 6 x= -3.1109374999999999e+00 f(x)= -2.279953e-03 iter = 7 x= -3.1117187499999996e+00 f(x)= 2.832980e-03 iter = 8 x= -3.1113281250000000e+00 f(x)= 2.741186e-04 iter = 9 x= -3.1111328125000002e+00 f(x)= -1.003516e-03 iter = 10 x= -3.1112304687500001e+00 f(x)= -3.648486e-04 iter = 11 x= -3.1112792968749998e+00 f(x)= -4.540242e-05 iter = 12 x= -3.1113037109374999e+00 f(x)= 1.143487e-04 iter = 13 x= -3.1112915039062496e+00 f(x)= 3.447081e-05 iter = 14 x= -3.1112854003906247e+00 f(x)= -5.466388e-06 iter = 15 x= -3.1112884521484370e+00 f(x)= 1.450207e-05 iter = 16 x= -3.1112869262695311e+00 f(x)= 4.517803e-06 iter = 17 x= -3.1112861633300781e+00 f(x)= -4.743013e-07 iter = 18 x= -3.1112865447998046e+00 f(x)= 2.021749e-06 iter = 19 x= -3.1112863540649416e+00 f(x)= 7.737231e-07 iter = 20 x= -3.1112862586975099e+00 f(x)= 1.497107e-07 iter = 21 x= -3.1112862110137938e+00 f(x)= -1.622953e-07 iter = 22 x= -3.1112862348556520e+00 f(x)= -6.292291e-09 -------------------------------- iter = 1 x= -2.6499999999999995e+00 f(x)= -2.033587e-02 iter = 2 x= -2.6249999999999996e+00 f(x)= 3.407065e-02 iter = 3 x= -2.6374999999999993e+00 f(x)= 7.970860e-03 iter = 4 x= -2.6437499999999994e+00 f(x)= -5.920977e-03 iter = 5 x= -2.6406249999999991e+00 f(x)= 1.092155e-03 iter = 6 x= -2.6421874999999995e+00 f(x)= -2.397834e-03 iter = 7 x= -2.6414062499999993e+00 f(x)= -6.486672e-04 iter = 8 x= -2.6410156249999992e+00 f(x)= 2.227903e-04 iter = 9 x= -2.6412109374999995e+00 f(x)= -2.126772e-04 iter = 10 x= -2.6411132812499991e+00 f(x)= 5.121923e-06 iter = 11 x= -2.6411621093749993e+00 f(x)= -1.037613e-04 iter = 12 x= -2.6411376953124992e+00 f(x)= -4.931561e-05 iter = 13 x= -2.6411254882812489e+00 f(x)= -2.209582e-05 iter = 14 x= -2.6411193847656240e+00 f(x)= -8.486695e-06 iter = 15 x= -2.6411163330078118e+00 f(x)= -1.682322e-06 iter = 16 x= -2.6411148071289055e+00 f(x)= 1.719816e-06 iter = 17 x= -2.6411155700683588e+00 f(x)= 1.875087e-08 iter = 18 x= -2.6411159515380853e+00 f(x)= -8.317847e-07 iter = 19 x= -2.6411157608032223e+00 f(x)= -4.065167e-07 iter = 20 x= -2.6411156654357906e+00 f(x)= -1.938828e-07 iter = 21 x= -2.6411156177520745e+00 f(x)= -8.756597e-08 iter = 22 x= -2.6411155939102167e+00 f(x)= -3.440754e-08 iter = 23 x= -2.6411155819892880e+00 f(x)= -7.828334e-09 -------------------------------- iter = 1 x= -2.4500000000000002e+00 f(x)= 7.559849e-02 iter = 2 x= -2.4249999999999998e+00 f(x)= 2.424472e-02 iter = 3 x= -2.4124999999999996e+00 f(x)= -6.914183e-03 iter = 4 x= -2.4187499999999997e+00 f(x)= 9.116930e-03 iter = 5 x= -2.4156249999999995e+00 f(x)= 1.213829e-03 iter = 6 x= -2.4140624999999996e+00 f(x)= -2.822123e-03 iter = 7 x= -2.4148437499999993e+00 f(x)= -7.971257e-04 iter = 8 x= -2.4152343749999994e+00 f(x)= 2.101080e-04 iter = 9 x= -2.4150390624999991e+00 f(x)= -2.930699e-04 iter = 10 x= -2.4151367187499995e+00 f(x)= -4.137119e-05 iter = 11 x= -2.4151855468749996e+00 f(x)= 8.439586e-05 iter = 12 x= -2.4151611328124996e+00 f(x)= 2.151920e-05 iter = 13 x= -2.4151489257812493e+00 f(x)= -9.924282e-06 iter = 14 x= -2.4151550292968746e+00 f(x)= 5.797886e-06 iter = 15 x= -2.4151519775390620e+00 f(x)= -2.063091e-06 iter = 16 x= -2.4151535034179683e+00 f(x)= 1.867424e-06 iter = 17 x= -2.4151527404785149e+00 f(x)= -9.782646e-08 iter = 18 x= -2.4151531219482418e+00 f(x)= 8.848006e-07 iter = 19 x= -2.4151529312133784e+00 f(x)= 3.934875e-07 iter = 20 x= -2.4151528358459466e+00 f(x)= 1.478306e-07 iter = 21 x= -2.4151527881622306e+00 f(x)= 2.500211e-08 iter = 22 x= -2.4151527643203727e+00 f(x)= -3.641217e-08 iter = 23 x= -2.4151527762413014e+00 f(x)= -5.705029e-09 -------------------------------- iter = 1 x= 2.1499999999999995e+00 f(x)= -7.901041e-02 iter = 2 x= 2.1749999999999998e+00 f(x)= 8.412914e-02 iter = 3 x= 2.1624999999999996e+00 f(x)= 2.958821e-03 iter = 4 x= 2.1562499999999996e+00 f(x)= -3.793627e-02 iter = 5 x= 2.1593749999999998e+00 f(x)= -1.746506e-02 iter = 6 x= 2.1609374999999997e+00 f(x)= -7.247040e-03 iter = 7 x= 2.1617187499999995e+00 f(x)= -2.142569e-03 iter = 8 x= 2.1621093749999996e+00 f(x)= 4.085135e-04 iter = 9 x= 2.1619140624999993e+00 f(x)= -8.669314e-04 iter = 10 x= 2.1620117187499996e+00 f(x)= -2.291848e-04 iter = 11 x= 2.1620605468749998e+00 f(x)= 8.967040e-05 iter = 12 x= 2.1620361328124997e+00 f(x)= -6.975567e-05 iter = 13 x= 2.1620483398437500e+00 f(x)= 9.957743e-06 iter = 14 x= 2.1620422363281246e+00 f(x)= -2.989887e-05 iter = 15 x= 2.1620452880859373e+00 f(x)= -9.970540e-06 iter = 16 x= 2.1620468139648437e+00 f(x)= -6.392551e-09 --------------------------------
 
for i=1:numZeros
fprintf('zero: %.8f\n',z(i)) %escrivim els zeros, amb 8 decimals
end
zero: -3.11128623 zero: -2.64111558 zero: -2.41515278 zero: 2.16204681
Feu el mateix aplicant el mètode de la secant, creant un nou fitxer secant.m . En aquest fitxer caldrà substituir la fórmula xc=(xa+xb)/2 (que correspon al mètode de bisecció) per la fórmula del mètode de la secant. Observeu com es redueix el nombre d'iteracions necessàries.
(Primer heu de crear el fitxer secant.m , copiant-lo del final del guió.)
tol=1e-8;
numZeros=size(intervals,1);
%nombre de files i, per tant, d'intervals trobats
for i=1:numZeros
xa=intervals(i,1); %copiem xa i xb d'una fila de la matriu
xb=intervals(i,2);
z(i)=secant(f,xa,xb,tol); %anem omplint un vector z amb els zeros
end
iter = 1 x= -3.1094764985737191e+00 f(x)= -1.179001e-02 iter = 2 x= -3.1110058784548626e+00 f(x)= -1.833212e-03 iter = 3 x= -3.1112430457840721e+00 f(x)= -2.825735e-04 iter = 4 x= -3.1112795880036535e+00 f(x)= -4.349756e-05 iter = 5 x= -3.1112852127218482e+00 f(x)= -6.694344e-06 iter = 6 x= -3.1112860783666174e+00 f(x)= -1.030237e-06 iter = 7 x= -3.1112862115862869e+00 f(x)= -1.585494e-07 iter = 8 x= -3.1112862320882479e+00 f(x)= -2.440008e-08 iter = 9 x= -3.1112862352434139e+00 f(x)= -3.755071e-09 -------------------------------- iter = 1 x= -2.6343306118158334e+00 f(x)= 1.480629e-02 iter = 2 x= -2.6402051106162832e+00 f(x)= 2.024306e-03 iter = 3 x= -2.6409976232553642e+00 f(x)= 2.629006e-04 iter = 4 x= -2.6411003691900423e+00 f(x)= 3.390943e-05 iter = 5 x= -2.6411136185806203e+00 f(x)= 4.369811e-06 iter = 6 x= -2.6411153259421631e+00 f(x)= 5.630604e-07 iter = 7 x= -2.6411155459388742e+00 f(x)= 7.255058e-08 iter = 8 x= -2.6411155742855330e+00 f(x)= 9.348154e-09 -------------------------------- iter = 1 x= -2.4237537314549300e+00 f(x)= 2.130064e-02 iter = 2 x= -2.4157168020557762e+00 f(x)= 1.449207e-03 iter = 3 x= -2.4151883865882682e+00 f(x)= 9.170845e-05 iter = 4 x= -2.4151550209630153e+00 f(x)= 5.776419e-06 iter = 5 x= -2.4151529196613968e+00 f(x)= 3.637308e-07 iter = 6 x= -2.4151527873473477e+00 f(x)= 2.290305e-08 iter = 7 x= -2.4151527790159277e+00 f(x)= 1.442135e-09 -------------------------------- iter = 1 x= 2.1628404123872191e+00 f(x)= 5.180666e-03 iter = 2 x= 2.1620593343448022e+00 f(x)= 8.175254e-05 iter = 3 x= 2.1620470111343764e+00 f(x)= 1.281144e-06 iter = 4 x= 2.1620468180179446e+00 f(x)= 2.007460e-08 iter = 5 x= 2.1620468149919496e+00 f(x)= 3.145537e-10 --------------------------------
 
for i=1:numZeros
fprintf('zero: %.8f\n',z(i)) %escrivim els zeros, amb 8 decimals
end
zero: -3.11128624 zero: -2.64111557 zero: -2.41515278 zero: 2.16204681

Funcions dels mètodes de Bisecció, Secant i Newton

function zero = biseccio(f, xa, xb, tol)
%-------------------------------------------------------------
% Funció Bisecció
%-------------------------------------------------------------
ya = f(xa);
yb = f(xb);
if (ya*yb >= 0) %descartem aquest cas però mirem si algun dels punts ja és un zero
if (abs(ya) < 1.e-15)
zero=xa;
return;
elseif (abs(yb)< 1.e-15)
zero=xb;
return;
elseif (ya*yb > 0)
error('interval incorrecte');
end
end
xc = (xa+xb)/2; %el punt mig
yc = f(xc);
iter=1; %escribim la primera iteració
disp(['iter = ',num2str(iter),' x= ',num2str(xc,'%24.16e'),' f(x)= ',num2str(yc,'%e')]);
while (abs(yc) > tol)
iter=iter+1;
if (ya*yc < 0)
xb=xc; %descartem xb
yb=yc;
else
xa=xc; %descartem xa
ya=yc;
end
xc =(xa+xb)/2;
yc = f(xc);
disp(['iter = ',num2str(iter),' x= ',num2str(xc,'%24.16e'),' f(x)= ',num2str(yc,'%e')]);
end
disp('--------------------------------');
zero=xc;
end
 
function zero = secant(f, xa, xb, tol)
%-------------------------------------------------------------
% Funció Secant
%-------------------------------------------------------------
ya = f(xa);
yb = f(xb);
if (ya*yb >= 0) %descartem aquest cas però mirem si algun dels punts ja és un zero
if (abs(ya) < 1.e-15)
zero=xa;
return;
elseif (abs(yb)< 1.e-15)
zero=xb;
return;
elseif (ya*yb > 0)
error('interval incorrecte');
end
end
xc = xb - f(xb)*(xb-xa)/(f(xb)-f(xa));
yc = f(xc);
iter=1; %escribim la primera iteració
disp(['iter = ',num2str(iter),' x= ',num2str(xc,'%24.16e'),' f(x)= ',num2str(yc,'%e')]);
while (abs(yc) > tol)
iter=iter+1;
if (ya*yc < 0)
xb=xc; %descartem xb
else
xa=xc; %descartem xa
end
xc = xb - f(xb)*(xb-xa)/(f(xb)-f(xa));
yc = f(xc);
disp(['iter = ',num2str(iter),' x= ',num2str(xc,'%24.16e'),' f(x)= ',num2str(yc,'%e')]);
end
disp('--------------------------------');
zero=xc;
end
function zero = newton(f, df, xa, xb, tol)
%-------------------------------------------------------------
% Funcio Newton
%-------------------------------------------------------------
x0 = (xb+xa)/2;
iter = 1;
xn = x0; %farem la primera iteració pel valor inicial
xm1 = xn - f(xn)/df(xn);
ym1 = f(xn);
disp(['iter = ',num2str(iter),' x= ',num2str(xm1,'%24.16e'),' f(x)= ',num2str(ym1,'%e')]);
while (abs(ym1) > tol)
iter=iter+1;
xn = xm1;
xm1 = xn - f(xn)/df(xn);
ym1 = f(xm1);
disp(['iter = ',num2str(iter),' x= ',num2str(xm1,'%24.16e'),' f(x)= ',num2str(ym1,'%e')]);
end
zero = xm1;
end
 
(c) Numerical Factory, 2023