Allocazione dinamica di una matrice
Buona sera a tutti. Avrei bisogno di chiedervi un aiuto con questo programma da compilare ( svolto parzialmente ma non so se correttamente..). Il testo dice:
"Si consideri il seguente sviluppo in serie di Taylor della funzione logaritmo naturale, approssimato al termine kesimo, con k scelto dall'utente tramite tastiera:
$ln(x)$= ∑$(((-1)^(n+1))/n)(x-1)^n$ con n che va da 1 a k.
1. scrivere una funzione “taylor_log” che implementa la serie di Taylor suindicata; la funzione dovra' ricevere due parametri, x ed k, dove k (termine di approssimazione) si presuppone che sia inserito da tastiera (nella funzione main() );
2. scrivere una funzione che calcola l'integrale definito di “ln(x)” utilizzando la regola dei trapezi:
∫$ln(x)dx$= $(h/2)(ln(a)+ln(b)+2$∑$ln(a+ih)$
(la serie va da i=1...m-1)
dove:
• “a” e “b” sono gli estremi di integrazione;
• “m” e' il numero di intervalli in cui suddividere [a, b];
• “h” e' la dimensione del singolo intervallo.
Si consideri che “a”, “b” ed “m” devono essere forniti da tastiera.
3. Calcolare tutti i valori di x e ln(x), per x appartenente all'intervallo [a, b], con incrementi di h, e
inserirli in una matrice m x 2, allocata dinamicamente;
4. Stampare i valori della matrice."
...........................................
Vi riporto quanto svolto finora ( non so se sia corretto!):
Chiedo il vostro aiuto ( ovviamente segnalate se vi sono errori!) per la parte /*alloco dinamicamente matrice */, ovvero per i punti 3) e 4). Spero possiate spiegarmi come procedere.
Vi ringrazio.
Alessandro
"Si consideri il seguente sviluppo in serie di Taylor della funzione logaritmo naturale, approssimato al termine kesimo, con k scelto dall'utente tramite tastiera:
$ln(x)$= ∑$(((-1)^(n+1))/n)(x-1)^n$ con n che va da 1 a k.
1. scrivere una funzione “taylor_log” che implementa la serie di Taylor suindicata; la funzione dovra' ricevere due parametri, x ed k, dove k (termine di approssimazione) si presuppone che sia inserito da tastiera (nella funzione main() );
2. scrivere una funzione che calcola l'integrale definito di “ln(x)” utilizzando la regola dei trapezi:
∫$ln(x)dx$= $(h/2)(ln(a)+ln(b)+2$∑$ln(a+ih)$
(la serie va da i=1...m-1)
dove:
• “a” e “b” sono gli estremi di integrazione;
• “m” e' il numero di intervalli in cui suddividere [a, b];
• “h” e' la dimensione del singolo intervallo.
Si consideri che “a”, “b” ed “m” devono essere forniti da tastiera.
3. Calcolare tutti i valori di x e ln(x), per x appartenente all'intervallo [a, b], con incrementi di h, e
inserirli in una matrice m x 2, allocata dinamicamente;
4. Stampare i valori della matrice."
...........................................
Vi riporto quanto svolto finora ( non so se sia corretto!):
#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <math.h> /* Dichiaro e definisco funzione taylor_log*/ double taylor_log( int x, int k) { int n, k; float log = 1; for ( n=1; n<k; n++) { if ( (n+1)%2) == 0) { log = log +pow (x-1,n)/n; } else { log = -log + pow (x-1,n)/n; } return log; } /* Dichiaro e definisco funzione che calcola l'integrale definito di ln(x) */ float integrale ( float a, float b, int m, int k) { int i; float h, risultato; h = (b-a) / m; risultato =0; for (i=1; i<=m-1; i++) { risultato = risultato + taylor_log (a+i*h, k); } return (h/2)(taylor_log(a,k)+taylor_log(b,k)+2*risultato); } int main (void) { int k, m, a, b, i; double logaritmo, x, calcolo; float** a; printf ( "Inserisci valore di k da tastiera"); scanf( "%d",&k); printf ( "Inserisci valore di x da tastiera"); scanf ("%lf", &x); logaritmo = taylor_log( int x, int k); printf (" Immetti valore di a:"); scanf ("%d"&a); printf ("Immetti valore di b:"); scanf ("%d",&b); printf ( "Immetti il numero di intervalli in cui suddividere [a,b,]"); scanf("%d", &m); printf (" La dimensione del singolo intervallo è %f", h=(b-a)/k); /* alloco dinamicamente matrice */ a = (float*) malloc( …. *sizeof(float*)); for ( i =1; i<k ; i=i+h) { if ( (x>=a) && (x<=b)) { printf ( " x appartiene all'intervallo"); calcolo = taylor_log ( int x, int k ); system ("pause"); return (0); }
Chiedo il vostro aiuto ( ovviamente segnalate se vi sono errori!) per la parte /*alloco dinamicamente matrice */, ovvero per i punti 3) e 4). Spero possiate spiegarmi come procedere.
Vi ringrazio.
Alessandro
Risposte
Ti ho inserito il codice nel tag code per renderlo più leggibile. Per il tuo professore allocare una matrice dinamicamente significa allocare un array di puntatori che puntano ognuno ad un vettore oppure è accettabile (di fatto si usa SEMPRE queste soluzione in un qualsiasi programma reale) allocare un vettore abbastanza lungo da contenere tutti gli elementi della matrice e poi fare qualche calcolo per accedere agli elementi?
Ti ringrazio apatriarca perché così è effettivamente più leggibile ( non sapevo come si utilizzasse il tag code). Ti riporto link su un esempio di allocazione dinamica di matrice effettuata dal docente:
Però, in questo caso già ho la dimensione delle matrici, per riga e per colonna. Nell'esercizio sopra, non so come calcolare tutti i valori di x e ln(x) ( con un if loop o un for loop potrei soddisfare richiesta : per x appartenente all'intervallo [a, b], con incrementi di h sempre all'interno del ciclo come incremento i=i+h), e inserirli in una matrice m x 2, allocata dinamicamente.
Il problema risiede appunto nell'inserire tali valori in vettori riga/colonna di una matrice m x 2...
(vorrei chiederti se ci sono altri errori nel programma che ho postato, dal momento che ancora non sono in grado di rendermene conto
ti ringrazio per l'aiuto
Però, in questo caso già ho la dimensione delle matrici, per riga e per colonna. Nell'esercizio sopra, non so come calcolare tutti i valori di x e ln(x) ( con un if loop o un for loop potrei soddisfare richiesta : per x appartenente all'intervallo [a, b], con incrementi di h sempre all'interno del ciclo come incremento i=i+h), e inserirli in una matrice m x 2, allocata dinamicamente.
Il problema risiede appunto nell'inserire tali valori in vettori riga/colonna di una matrice m x 2...
(vorrei chiederti se ci sono altri errori nel programma che ho postato, dal momento che ancora non sono in grado di rendermene conto

Il tuo problema è insomma capire quanto vale m? Dovrebbe valere \(1 + \lfloor(b - a)/h \rfloor\).
in realtà non ho capito come fare per calcolare i valori (tutti) di x e ln(x) ed inserirli come vettori in una matrice mx2 allocata dinamicamente.. Ancora non so scomporre bene i vari passaggi per ricavarmi il programma