Creazione tabelle MATLAB

Controllore1
Ciao ragazzi,
vi scrivo perché sto facendo un esercizio di preparazione all'esame e recita così:

"Scrivere una funzione Matlab che data la funzione f(x)=ln(x), ed un punto x, calcoli le approssimazioni di f'(x) date da: $ D_h(x)= (f(x+h)-f(x))/h $ per $ h=10^(-i), i=1,2,...,16 $.
Il programma deve visualizzare in una tabella, per ogni valore di f, il corrispondente valore $ D_h(x) $ e l'errore assoluto $ e_h=|f'(x)-D_h(x)| $ .
a) Utilizzare tale script per approssimare la derivata di ln(x) in x=0.1,1,10,100. Quale è in ciascuno dei casi il valore di h ottimale?"

Premettendo che è veramente da poco che uso Matlab, ho provato a buttare giù uno script ed ho scritto questo:

function [ y ] = Dh( x )
for k=1:16
h=10^-(k);
end
y=(log(x+h)-log(x))/h;
end

Secondo voi può essere corretto? Come faccio a visualizzare in una tabella quello che mi si richiede?

Scusate il disturbo, spero sia comprensibile!

Risposte
Raptorista1
No che non è corretto, hai provato a farlo girare?

Controllore1
Ciao Raptorista, innanzitutto grazie per la risposta! Sì, ho provato dando dei valori a Dh scrivendo, ad esempio, Dh(3) e mi restituisce "0" per ogni numero che ci metto. Sto imparando pian piano ad usare Matlab e gli altri esercizi che ho provato a fare mi tornano, ma di questo non ci capisco niente! Io solitamente faccio così:
Scrivo lo script della funzione e poi la copio in un nuovo editor e faccio il grafico. Ho fatto questa cosa anche per questo script scrivendo questo in un nuovo editor:


x=linspace(-2,2,100000);
[ y ] = Dh( x );
plot(x,y)


Mi restituisce un grafico simile alla retta y=0 con valori infiniti intorno ad x=0.

Non capisco come sia possibile questa cosa e dove sbaglio, potresti darmi una mano? Scusa il disturbo, ti ringrazio!

Raptorista1
Questa non è una questione di conoscenza dello specifico linguaggio: in quelle due righe c'è un errore banale che si vede ad occhio!
Tra l'altro, dovresti già essertene accorto dal fatto che ricevi in output solo una funzione...

Controllore1
Allora forse devo mettere in output anche h? Il mio problema è che non faccio informatica e non ho mai avuto a che fare con queste cose. Grazie ancora Raptorista!

Raptorista1
"Controllore":
Allora forse devo mettere in output anche h?

Certo, io aggiungerei anche D in output, e magari un paio di parentesi ed una ragazza in bikini, che non fanno mai male.
Ti spiace fare uno sforzo di testa prima che di dita? XD

Che tipo di oggetto deve costruire la funzione [inline]Dh[/inline]?

Controllore1
:D :D :D :D La ragazza in bikini sarebbe il massimo :D :D :D :D
A parte le battute, ho provato a ragionare su quello che mi hai detto ed il mio ragionamento (per quanto possa essere sbagliato), è questo:
La mia funzione y dipende da due variabili, ovverosia x ed h. Per quanto riguarda la x, non dovrebbe esserci niente di sbagliato in quanto quando vado a far lavorare la funzione su un altro editor metto il dominio della x stessa. Pensandoci però in input ho messo solo x senza metterci anche h, e forse è questo il mio errore.

Ho provato a fare in questo modo che ho appena descritto, mettendo anche il dominio di h nello script in cui faccio girare la funzione, ma la situazione rimane analoga. Posto qui quello che ho fatto:

function [ y ] = Dh( x,h )
for k=1:16
h=10^-(k);
end
y=(log(x+h)-log(x))/h;
end


Nello script in cui faccio girare la funzione, invece:

x=linspace(-2,2,100000);
h=-100:0.01:100;
[ y ] = Dh( x,h );
plot(x,y)

La situazione rimane la solita, eppure ho provato a ragionarci! Sono pochi giorni che uso Matlab e non ho mai fatto niente di programmazione in quanto sto facendo il corso magistrale di Ingegneria Civile, non so usare questi programmi.

Adesso però mi viene un altro dubbio: se metto due variabili in ingresso (x ed h) e faccio plot(x,y), non ottengo il grafico corretto anche se lo script fosse giusto, vero?


Per rispondere a quanto mi hai chiesto, Dh deve costruire uno scalare ed io in input ho messo dei vettori. Forse il problema, ora che ci penso, potrebbe essere questo :roll:

Raptorista1
Tu continui a non ascoltarmi, ed io prima o poi mi stuferò di risponderti:
"Raptorista":

Che tipo di oggetto deve costruire la funzione [inline]Dh[/inline]?

Controllore1
Capisco che tu possa stufarti, però non sto facendo lo stupido volontariamente. La funzione deve approssimare la derivata di ln(X) e per farlo ha bisogno di una serie di punti di h.

Raptorista1
Non sto dicendo che fai lo stupido volontariamente, né che tu effettivamente lo sia, ma solo che non ti stai concentrando abbastanza!

"Raptorista":

Che tipo di oggetto deve costruire la funzione [inline]Dh[/inline]?
1. Uno scalare
2. Un vettore
3. Una matrice


Togli [inline]h[/inline] come parametro della funzione che è evidentemente inutile, il primo passo dev'essere di chiamare
[ y ] = Dh( 1 )

ottenendo il risultato corretto.

Controllore1
Ok, allora avevo frainteso quello che mi avevi detto! Quattro post più in alto avevo già risposto sul cosa deve costruire, ed avevo scritto che deve venir fuori uno scalare. Ti ringrazio ancora per la pazienza che stai avendo nei miei confronti :D

Raptorista1
"Controllore":
Quattro post più in alto avevo già risposto sul cosa deve costruire, ed avevo scritto che deve venir fuori uno scalare.

E infatti già questo è sbagliato xD

"Controllore":
"Scrivere una funzione Matlab che data la funzione f(x)=ln(x), ed un punto x, calcoli l[size=150]e[/size] approssimazion[size=150]i[/size] di f'(x)

Controllore1
Ah, ecco :(
Allora in input devo mettere uno scalare x mentre in output devo ottenere un vettore y, ho capito. Ci ragiono un po' e provo a trovare la soluzione, grazie mille Raptorista!

Controllore1
Raptorista, ho creato questo script che mi dà in output un vettore di 16 componenti:

function [ y ] = Dh( x );
for k=1:1:16;
h=10^(-k);
y(k)=(log(x+h)+log(x))/h;
end
end

Mi pare funzioni, che te ne pare? :roll:

Raptorista1
Bene, questo è il primo passo buono di tutta la discussione! Adesso procedi col calcolo di quello che ti manca.

Controllore1
:D :D :D :D ti ringrazio ancora per essere stato così paziente e comprensivo con me (ti ho messo a dura prova)! Buona giornata ed a presto, Raptorista!

Raptorista1
Pfffffffff, non sei mica il primo ingegnere che scrive sul forum... Se hai altri problemi, scrivi senza remore [ma usando la zucca!].

Controllore1
:D Certamente, a presto!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.