
//
Calcolo la derivata di una funzione di classe C1 utilizzando come criterio di
convergenza
// il confronto del differenziale di sinistra
con il differenziale di destra.
//
//
09/10/2019 saurischio@gmail.com
//---------------------------------------------------------------------
clc;clf;clear;
function f=funzione(x)
f=3*x+x^2+x^3
endfunction
x0=2; // punto in cui calcolare la derivata
dx=0.1; // intervallo dx iniziale
errmin=0.001 // errore relativo richiesto
//
// La
funzione "derivata" realizza una derivata prima e verifica la
convergenza
//
//
Gli INPUT sono:
//
"x0" = il valore per cui calcolare la derivata
//
"funct" = la funzione da derivare
//
"dx" = il passo iniziale su cui calcolare il differenziale
//
"minerrore" = l'errore relativo sotto il quale scendere
//
//
Gli OUTPUT sono successioni di valori per passi sempre più piccoli:
//
"f" = derivate
//
"ddx" = passi dx
//
"Ddx" = derivate a destra
//
"Dsx" = derivate a sinistra
//
"errore" = errori relativi
//
function [f, ddx, Ddx, Dsx, errore]=derivata(x0, funct, dx, minerrore)
i=0
progressione=[]
errore=minerrore+1
while errore>minerrore
i=i+1
ddx(i)=2*dx/2^i
Ddx(i)=(funct(x0+ddx(i))-funct(x0))/ddx(i)
Dsx(i)=(funct(x0)-funct(x0-ddx(i)))/ddx(i)
f(i)=(funct(x0+ddx(i))-funct(x0-ddx(i)))/(2*ddx(i))
errore(i)=abs(Ddx(i)-Dsx(i))/f(i)
end
endfunction
//
//
Eseguo la funzione appena definita per i valori richiesti
[deriv,ddx,Ddx,Dsx,errore]=derivata(x0,funzione,dx,errmin)
//
Grafico la funzione e la sua tangente al punto
warning('off')
xlist=(x0-5*dx):(10*dx)/100:(x0+5*dx)
ylist=funzione(xlist)
plot(x0,funzione(x0),"*r")
function f=tangente(x)
f=funzione(x0)+deriv*(x-x0)
endfunction
tangoy=tangente(xlist)
plot(xlist,ylist,"-b",xlist,tangoy,"-g")
legend("punto
di tangenza","funzione","sua
tangente")
warning('on')
//
Creo una tabella su console
nomi=["order","derivative","+/-"," left
"," right
"," dx "]
dati=cat(2,(1:size(deriv)(1))',deriv,deriv.*errore/2,Dsx,Ddx,ddx)
disp(nomi)
disp(dati)

Nessun commento:
Posta un commento