Newsgroup: it.comp.lang.visual-basic
Titolo: Visual Basic e le derivate

salve, sono Massimo!
Ho un problema: vorrei realizzare un programma VB che calcoli la derivata di
una funzione f(x) impostata dall'utente in un punto x0 immesso anch'esso
dall'utente.
L'unico problema è che i metodi numerici che ho provato sinora per il
calcolo di f '(x0) usano tutti (giustamente) il rapporto incrementale con un
incremento h sensibilmente piccolo (ai limiti della possibilità di calcolo
di VB, che non sono molte cifre decimali, mi sembra non lo consideri se più
piccolo di 1e-10): l'unico problema è che il risultato ottenuto non è
soddisfacente, basti pensare che per funzioni tipo x^2 e x0=2 anzichè
restituirmi 4 mi dà 3.879234.... valore che proprio non si può accettare!!!
Qualcuno mi potrebbe suggerire una procedura di approssimazione numerica
migliore (che sfrutti magari il concetto di limite...)?
grazie
--
Massimo Di Casola
Email: 
max...@iol.it
"Non vogliamo più la verità. Dateci il sogno. Riposo non avremo, se non
nelle ombre dell'ignoto"
(Gabriele D'Annunzio)



...


 grazie
Hai due possibilita'
1) calcolo del rapporto incrementale per valori dell'incremento
decrescenti fino ad avere una 'precisione' adeguata ( la precisione la
puoi calcolare come differenza di due iterazioni successive ) questo
metodo e' pericoloso in quanto capita che facendo tendere a 0
l'incremento il valore del rapporto incrementale puo' andarsene a valori
errati a causa della precisione finita del float ( o double )
2) approssimazione con un polinomio di grado adeguato della funzione in
esame e calcolo della derivata esatta del polinomio nel punto desiderato
magari anche qui iterando con polinomi di ordine crescente
Fammi sapere se ti serve altro aiuto
Marco

 dall'utente.
[cut]
Una volta feci delle funzioni che calcolavano il limite, la derivata e
l'integrale di una funzione, pero' in MS-BASIC. Non so se riesco a trovarlo
(dovrei averlo scritto su qualche foglio di carta e registrato su qualche
cassetta).
Bisogna pero' convertirle in VB.
A proposito, qualcuno conosce l'MSX?
--
ciao
gelty
--
Visita 
http://www.sifor.it
Elimina *toglimi* per le risposte

Una possibile soluzione e' questa:
non la criticate troppo perche' comunque e' un po' naif
tenta di calcolare la derivata come limite del rapporto incrementale
dimezzando progressivamente il dx
'--- cut here ---
Const EPS = 0.00001     ' precisione desiderata ( non quella effettiva )
Const MAXITER = 1000    ' numero max d'iterazioni
Const DXINIT = 1        ' valore iniziale dell'incremento ( scegliere a
piacere )
' funzione d'esempio di cui calcolare la derivata
Private Function f(x As Single) As Single
    f = Exp(x)
End Function
' calcola la derivata come limite del rapporto incrementale
Private Function df(x0 As Single) As Single
Dim n As Long, dx As Single, fx As Single
Dim d1, d2 As Single
    n = 0
    dx = DXINIT
    fx = f(x0)
    d2 = (f(x0 + dx) - fx) / dx
    Do
        d1 = d2
        dx = dx / 2
        d2 = (f(x0 + dx) - fx) / dx
        n = n + 1
    Loop While n < MAXITER And Abs(d2 - d1) > EPS
    df = d2
End Function
'--- cut here ---

...


 Bisogna pero' convertirle in VB.
Non dovrebbe essere difficile, no?
Bye
-- 
Ale...@tiscalinet.it

 
Lo so benissimo , mi sono 'dimenticato' di dire che non si puo'
spingere  troppo quell' EPS cioe' non puo' essere scelto comparabile con
la precisone del single ma solo alcuni ordini di grandezza piu' grande
inoltre si potrebbe inserire un controllo che tra un'iterazione e la
successiva abs(d2-d1) sia decrescente , ma anche questa soluzione e'
potenzialmente pericolosa
 
Marco

 Non dovrebbe essere difficile, no?
Beh, non so, perche' una di queste funzioni (quella del limite, credo) era
una funzione ciclica, e mi sono sorpreso quando ha funzionato, cioe' ho
fatto qualcosa del genere:
DEFFN LIMITE = [CalcolaQualcosa] * LIMITE
(DEFFN serviva a definire la funzione).
E ricordo che questa funzione era essenziale almeno per calcolare la
derivata, ma credo anche per l'integrale.
Appena riesco a recuperarle le posto sicuramente.
