DA UNA SERIE DI PUNTI P(x,y,z) ALLA FUNZIONE z=f(x,y)
Ho una tabella a 3 colonne con le seguenti variabili:
1° colonna - C
carico massimo
2° colonna - L
lunghezza massima
3° colonna - P
prezzo
Esistono delle leggi matematiche che permettono di determinare P in funzione di C e di L? C ed L sono anche tra loro correlate. Più C é grande minore é il valore di L.
Non posso disegnare i grafici usando le leggi di correlazione che conosco perché gli algoritmi di calcolo sono molto complessi richiodono l'uso di software e nel problema in questione assumono importanza anche un'infinità di altre variabili (almeno 100).
Il mio obiettivo é riuscire a stampare un grafico che possa essere utilizzato senza l'uso del PC in cui l'operatore sceglie un valore di C, di L e valuta il prezzo oppure a creare un software in C apposito semplicissimo.
Il mio problema é di natura matematica perché non so come:
1 – determinare l'inviluppo (prezzo massimo)
2 – determinare la curva di interpolazione (prezzo medio – rischio elevato)
3 – determinare la curva di 'sottoinviluppo' (prezzo minimo – rischio elevatissimo)
Ho Matlab, C# e Mathematica, AutoCAD come software disponibili. Le tabelle sono su excel.
4 – Quale programma mi consigliate?
5 – Su Matlab esistono delle funzioni che mi possono venire utili?
Ciao e grazie
1° colonna - C
carico massimo
2° colonna - L
lunghezza massima
3° colonna - P
prezzo
Esistono delle leggi matematiche che permettono di determinare P in funzione di C e di L? C ed L sono anche tra loro correlate. Più C é grande minore é il valore di L.
Non posso disegnare i grafici usando le leggi di correlazione che conosco perché gli algoritmi di calcolo sono molto complessi richiodono l'uso di software e nel problema in questione assumono importanza anche un'infinità di altre variabili (almeno 100).
Il mio obiettivo é riuscire a stampare un grafico che possa essere utilizzato senza l'uso del PC in cui l'operatore sceglie un valore di C, di L e valuta il prezzo oppure a creare un software in C apposito semplicissimo.
Il mio problema é di natura matematica perché non so come:
1 – determinare l'inviluppo (prezzo massimo)
2 – determinare la curva di interpolazione (prezzo medio – rischio elevato)
3 – determinare la curva di 'sottoinviluppo' (prezzo minimo – rischio elevatissimo)
Ho Matlab, C# e Mathematica, AutoCAD come software disponibili. Le tabelle sono su excel.
4 – Quale programma mi consigliate?
5 – Su Matlab esistono delle funzioni che mi possono venire utili?
Ciao e grazie
Risposte
Ho provato a scrivere questo:
ma non mi piace molto perché preferirei ottenere una funzione analitica. Il software finale vorrei farlo in Visual C# ma se non trovo un'espressione della F devo convertire in dll e fare mille pasticci per la conversione che non so fare e che non so neppure come imparare a fare.
Attendo fiducioso un vostro aiuto
Grazie
length = [2,3,2,3,4,4]'; load = [300,202,602,400,200,102]'; price = [3,4,6,7,8,5]'; F = TriScatteredInterp(length, load, price); thisPrice = F(2.5, 302)
ma non mi piace molto perché preferirei ottenere una funzione analitica. Il software finale vorrei farlo in Visual C# ma se non trovo un'espressione della F devo convertire in dll e fare mille pasticci per la conversione che non so fare e che non so neppure come imparare a fare.
Attendo fiducioso un vostro aiuto
Grazie
Lo sposto in Informatica per vedere se ha maggiore visibilità.
Potresti chiarire meglio le variabili in gioco? Non ho alcuna idea di quale sia il significato di carico o lunghezza massima in questo contesto. Sembri però interpretare questi valori semplicemente come 3 coordinate in \(\mathbb R^3\). Possiamo quindi ignorare questi concetti?
Che intendi con inviluppo e sottoinviluppo in questo contesto? Visto l'uso di TriScatteredInterp mi è invece abbastanza chiaro il significato di curva di interpolazione, anche se parlerei di superficie in questo caso. Questa superficie passa però esattamente per i punti, è una necessità oppure potrebbe anche solo approssimarli molto bene?
Una curva analitica è in generale complicata da rappresentare su di un computer, a meno che non abbia una forma particolare e che dipenda da una quantità finita di parametri. In tal caso ti ridurresti comunque probabilmente a minimizzare questi parametri con ad esempio il metodo dei minimi quadrati.
Alternativamente, se ammetti l'uso del PC, forse puoi fare ricorso ad un qualche algoritmo di supervised machine learning per risolvere il tuo problema originale senza passare da una sua rappresentazione geometrica.
Che intendi con inviluppo e sottoinviluppo in questo contesto? Visto l'uso di TriScatteredInterp mi è invece abbastanza chiaro il significato di curva di interpolazione, anche se parlerei di superficie in questo caso. Questa superficie passa però esattamente per i punti, è una necessità oppure potrebbe anche solo approssimarli molto bene?
Una curva analitica è in generale complicata da rappresentare su di un computer, a meno che non abbia una forma particolare e che dipenda da una quantità finita di parametri. In tal caso ti ridurresti comunque probabilmente a minimizzare questi parametri con ad esempio il metodo dei minimi quadrati.
Alternativamente, se ammetti l'uso del PC, forse puoi fare ricorso ad un qualche algoritmo di supervised machine learning per risolvere il tuo problema originale senza passare da una sua rappresentazione geometrica.
Si possiamo tranquillamente ragionare in termini di coordinate. In pratica ho una matrice 300x3 di questo tipo:
M=[
x1 y1 z1
x2 y2 z2
...
xi yi zi
...
xn yn zn
];
da cui voglio ottenere i coefficienti del polinomio di grado n-1 (nel mio caso n=299), sperando nella potenza di calcolo del mio PC, che deve, per logica matematica, essere tangente ad ogni mio punto.
Il problema é che le immagini dei punti Pi(xi,yi,zi) sul piano x-y (dominio della funzione) non sono esattamente disposti su una grilia (o maglia) regolare e la parte di funzione che interessa a me é solo quella in cui ricadono le immagini stesse.
Sempre su matlab ho provato a scrivere:
ma non funziona perché i punti sono in 'disordine'... Non so più a cosa pensare...
Risolto questo problema, o nell'eventualità che il mio processore non riesca a calcolare tutto quanto, sarei anche interessato a fare un'analisi ai minimi quadrati.
A me servirebbe qualche codice di esempio...
Ciao e grazie per il vostro interesse
M=[
x1 y1 z1
x2 y2 z2
...
xi yi zi
...
xn yn zn
];
da cui voglio ottenere i coefficienti del polinomio di grado n-1 (nel mio caso n=299), sperando nella potenza di calcolo del mio PC, che deve, per logica matematica, essere tangente ad ogni mio punto.
Il problema é che le immagini dei punti Pi(xi,yi,zi) sul piano x-y (dominio della funzione) non sono esattamente disposti su una grilia (o maglia) regolare e la parte di funzione che interessa a me é solo quella in cui ricadono le immagini stesse.
Sempre su matlab ho provato a scrivere:
x=[-1,-1,1,1]'; y=[-1,0,1,2]; z=exp(-(x.^2*y.^0/100+x*y/140+x.^0*y.^2/50)); P_equalweight=polyfitweighted2(x,y,z,3,ones(101)); P_weighted=polyfitweighted2(x,y,z,3,z);
ma non funziona perché i punti sono in 'disordine'... Non so più a cosa pensare...
Risolto questo problema, o nell'eventualità che il mio processore non riesca a calcolare tutto quanto, sarei anche interessato a fare un'analisi ai minimi quadrati.
A me servirebbe qualche codice di esempio...
Ciao e grazie per il vostro interesse
Non credo che sia una buona idea quella di usare un polinomio di così alto grado. Anche ammettendo che tu riesca a trovare questo polinomio, potrebbe oscillare troppo e non essere particolarmente utile. Inoltre avrebbe una enorme quantità di parametri e non sarebbe più gestibile dei punti stessi. La triangolazione di Delaunay mi sembrava una buona idea in quanto non ha bisogno di un ordinamento dei vertici, ma forse non è comodo utilizzarla per i tuoi scopi. Cosa dovresti farci di questa superficie una volta ottenuta? A che tipo di domande dovrebbe rispondere?
Devo creare un programma in Visual C# con relativa interfaccia grafica che noti xi e yi mi calcoli zi interpolato ma dato che non riesco ad esportare la funzione TriScatteredInterp in Visual C#, anche se su matlab in teoria c'é la possibilità, sto costruendo una matrice gigantesca da esportare manualmente su C#. Il lavoro é una porcheria ma non so proprio come fare. Hai capito il mio problema? Non riesco a far dialogare matlab con C#... Mi piacerebbe che qualcuno mi spiegasse il principio da seguire per esportare una funzione creata in matlab o propria di matlab su C#. Ho provato a vedere questo video ma dato che é in inglese non ci capisco nulla... inoltre conosco pure male in C#... sono proprio depresso...
http://www.mathworks.it/products/compiler/
A presto e grazie
http://www.mathworks.it/products/compiler/
A presto e grazie
Io credo che ti convenga dimenticare Matlab e concentrarti direttamente su cosa puoi fare in C#. Il problema da te descritto sembra un classico problema di regressione e proverei probabilmente a risolverlo minimizzando ai minimi quadrati una qualche superficie polinomiale. Alternativamente, se ti piace l'idea della funzione TriScatteredInterp, dovresti cercarti classi che calcolino la triangolazione di Dalaunay di una serie di punti (300 non sono molti).
E' proprio questo il punto, non ho trovato nulla relativamente alla triangolazione di Delaunay su C#...

Possibile che mai nessuno abbia dovuto usare una funzione di matlab in C... mi sembra molto strano...
Sono riuscito a creare una matrice in matlab contenente tutti i risultati. Potreste dirmi come posso esportarla su visual c#? Ho visto che c'é una funzione di matlab che permette di esportare in csv e in xls... il csv permette di contenere più dati, oltre le 6500 righe circa....
Aspetto un vostro aiutino...
grazie
Aspetto un vostro aiutino...
grazie
Penso che se scrivi in un normalissimo file di testo e in C# leggi dal file di testo, puoi far passare un numero qualunque di dati [hardware permettendo].
Perdona la mia ignoranza ma se uso un file di testo quest'ultimo non verrebbe inglobato durante la compilazione, giusto?
Che significa "inglobato"?? XD
In pratica vorrei che l'eseguibile fuzioni senza che li vicino ci sia anche il .txt. Come se scrivesi:
double[,] ggg = { { 30 , 5 , 4 , 4 }, { 40 , 1 , 4 , 5 }, ... { 40 , 5 , 6 , 7 }};
Ho risolto tutto quanto ma mi resta un ultimo problema. Come posso separare la matrice ggg dal codice? Su C++ si usava #include ed era tutto semplicissimo... con c# invece?
