Lezioni

1.2.1. Realizzazione di un programma in Scilab che deriva numericamente e include criteri di convergenza.




// 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