Esercizio 4
Antonino Polimeno
Universit` a degli Studi di Padova
Soluzioni di equazioni non-lineari - 1
I Radici di un polinomio: roots(p) d` a le radici di un polinomio rappresentato dal vettore colonna di coefficienti p
p = [3 -2 -4];
r = roots(p) r =
1.5352 -0.8685
I Soluzione di una equazione non-lineare: fzero(fun,x0) d` a una soluzione, se esiste, vicina a x0
fun = @sin; % function x0 = 3; % initial point x = fzero(fun,x0)
x = 3.1416
Soluzioni di equazioni non-lineari - 2
Soluzione di un sistema di equazioni: x=fsolve(fun,x0)tenta di trovare al soluzione di un sistema di equazioni vicina al vettore x0; per esempio, vogliamo trovare la soluzione del sistema
e−e−(x1 −x2 )− x2(1 + x12) = 0 x1cos x2+ x2sin x1− 0.5 = 0
definiamo la funzione root2d
function F = root2d(x)
F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end
e troviamo la radice vicina al punto (0, 0)
fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)
Equation solved.
fsolve completed because the vector of function values is near zero as measured by the default value of the function tolerance, and the problem appears regular as measured by the gradient.
x =
Calcolo del pH di un acido poliprotico - 1
Equilibri:
H n A −−* )−− H n−1 A − + H + K 1 = [H
n−1A
−
][H
+] [H
nA]
H n−1 A − −−* )−− H n−2 A 2− + H + K 2 = [H
n−2A
− 2
][H
+] [H
n−1A
−]
. . .
HA (n−1)− −−* )−− A n− + H + K n = [A
n−][H
+]
[HA
(n−1)−]
H 2 O −−* )−− OH − + H + K w = [H + ][OH − ] Se [H n A] iniziale = a 0 , vale il bilancio di massa:
n
X
i =0
[H n−i A i − ] = a 0
e il bilancio di carica:
n
X
i =1
i [H n−i A i − ] + [OH − ] = [H + ]
Calcolo del pH di un acido poliprotico - 2
Definiamo x = [H + ], x i = [H n−i A i − ]:
K i = xx i x i −1
n
X
i =0
x i = a 0
n
X
i =1
ix i + K w
x = x
da cui troviamo che
x i = Π i j =1 K j x 0
x i = r i x 0
x i
Calcolo del pH di un acido poliprotico - 3
Combinando le due relazioni lineari con l’ultima equazione eliminiamo x 0 ; ponendo z = 1/x = 1/[H + ]:
a 0 P n
i =1 ir i z i 1 + P n
i =1 r i z i + K w z − 1 z = 0
L’equazione polinomiale seguente ha radici non nulle in comune con la relazione precedente:
n+2
X
j =0
c j z j = 0
Abbiamo ora un’equazione polinomiale di grado n + 2; delle n + 2
radici, si verifica che solo una ` e reale e positiva e quindi il cui
inverso ` e identificabile con [H + ]
Script 4
% title
fprintf(’Exercise n. 4\n\n\n’)
% exponential format format shortEng format compact
% read data
ex4_data=load(’ex4_script.dat’);
% number of points ndata=size(ex4_data);
n=ndata(1,1)-2;
fprintf(’Acid with %2.0f protons \n’,n) kappa=ones(n,1);
for i=1:n
kappa(i)=ex4_data(i);
end
kw=ex4_data(n+1);
a0=ex4_data(n+2);
r=ones(n,1);
for i=1:n for j=1:i
r(i)=r(i).*kappa(j);
end end
Script 4 cont.
p0=zeros(3,1)’;
p1=zeros(n+1,1)’;
p2=zeros(3,1)’;
p3=zeros(n+1,1)’;
p0(2)=a0;
p2(1)=kw;
p2(3)=-1.0;
for i=1:n
p1(n-i+1)=i*r(i);
p3(n-i+1)=r(i);
end p3(n+1)=1.0;
p=zeros(n+3,1)’;
p=conv(p0,p1)+conv(p2,p3);
rad=roots(p);
i=1;
while i<n+4 & rad(i)<0 i=i+1;
end
ph=log10(rad(i));
Script 4 cont.
% display results fprintf(’Results\n\n’) fprintf(’pH: %8.2f \n’,ph) nstep=1000;
amin=-log10(a0);
astep=2*log10(a0)/(nstep-1);
for j=1:nstep
a=10^(amin+(j-1)*astep);
p0(2)=a;
p=zeros(n+3,1)’;
p=conv(p0,p1)+conv(p2,p3);
rad=roots(p);
i=1;
while i<n+4 & rad(i)<0 i=i+1;
end
aplot(j)=log10(a);
phplot(j)=log10(rad(i));
end
plot(aplot,phplot) xlabel(’log_{10}(a_{0})’) ylabel(’pH’)