Ciao ragazzi, ieri ho scritto una mail nel cui titolo non ho specificato bene il mio quesito ne il linguaggio che dovrei adoperare. Me ne scuso.
Si trattava di un quesito che riguarda la successione di vettori, e che rimanda al problema più grande del metodo iterativo di Jacobi per risolvere i sistemi lineari.
Sinceramente la parte che mi sta venendo difficile da impostare è appunto il meotodo ricorsivo che riguarda la successione del vettore. Ricapitolando il problema era:
"
Trattasi di effettuare una successione di vettori.
Gli imput sono:
1) Acquisire da tastiera un valore intero k;
2) Acuisire da tastiera due matrici M e N, di dimensione (k*k);
3) Acuisire da tastiera due vettori z1, e z2 di k elementi;
Dati questi imput trovare la successione di vettori espressa nel seguente modo:
z(n+1) = M*z(n) + N*z(n-1)
per n = 2,3,4.......300.
Orbene, quello che non riesco bene ad impostare è il vettore z, nel senso che per n=2, z dovrebbe essere nella parte destra dell'equazione rispettivamente z2 e z1.
Ma come faccio ad impostare che per n= 2, z(n) assume i valori di z2 e z1. L'unica cosa che mi viene in mente è che la successioni di valori in realtà sia una matrice, dove l'ultima riga (o colonna) è il valore della successione.
Potreste farmi un'esempio di come devo impostare il ciclo for di questa successione, sto veramente uscendo di testa , nel capire che cosa è intanto z(n), (matrice o vettore) ed il suo comportamento.
"
Ieri sera ho cercato di impostare un piccolo procedimento ricorsivo sul c++, al fine al meno di effettuare la successione relativa a :
z(n+1)= M*z(n) (una parte di quella che è il problema originario).
Il codice è :
"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;
double** Matrice(int r,int c);/*funzione che crea dinamicamente una matrice di r righe e c colonne*/
void leggimat(int r, int c, double** M );
main()
{int i,k,n,j,h,y; double x;
cout<<"\n dammi la dimensione k della matrice k*k= ";
cin>> k;
if (k>40) return 0;
double** M; /* variabile puntatore */
double** N; /* variabile puntatore */
M = Matrice(k,k);
N = Matrice(k,299);
leggimat(k,k,M);
leggimat(k,k,L);
leggimat(1,1,N);
n = 11;/*numero di successioni/
for(i=0; i<k ;i++)
{
for(j=1; j<n ;j++)
{
N[i][j]=0 ;
for(y=0; y<k ;y++)
{
N[i][j]= M[i][y] * N[y][j-1] ;/*Tentativo di successione /
}
}
}
cout<<"\n Matrice N = ";
for(i=0; i<k ;i++)
{
for(j=0; j<n ;j++)
{
cout << "\n l'elemento di riga "<< i << " e di colonna " << j << ": "<< N[i][j];
N[i][j];
}
}
system("\n PAUSE");return 0;
}
double** Matrice(int r, int c )
{
double** m;
int i,j;
m=new double* [r];
/* ora posso creare le righe */
for (i=0;i<r;i++)
m[i] = new double[c];
return m;
}
void leggimat(int r, int c, double** M )
{
int i,j;
for ( i = 0; i <r; i++)
for (j = 0; j <c; j++){
cout << "\n Inserire l'elemento di riga "<< i
<< " e di colonna " << j << ": ";
cin >> M[i][j];
}
}
"
Nel caso specifico ho creato lo spazio in memoria della matrice N con dimensione (k,299), però ho inizializzato soltatnto il primo vettore riga con numeri acqusiti dal prompt.
Ieri ho testato il codice, ed effettivamente esegue delle operazioni ricorsive, adesso sto cercando di capire se sono corrette.
L'obbiettivo sarebbe quello di ottenere, dato il numero di successioni n<300, (settato a 11 nel codice), il vettore N(k,n) come output della successione di vettori.
Poi mi chiedevo ma è possibile impostare il problema in un modo più semplice?
Nel senso che posso anzichè creare una matrice (N) che ha come ultimo vettore quello richiesto, avere direttamente un vettore che cambia valore e che si arresta alla successione n?
Ringrazio tutti per l'eventuale aiuto o suggerimento.
Amartya
P.S.
Spero di essere stato chiaro.![]()