Scusate ma posso dedicare un po' di tempo al forum solo ora.
Dunque, cerchiamo di rispondere ad entrambi in un colpo solo.
paofanello ha scritto:Scusate l'intrusione

, spero di non disturbare troppo ma l'argomento si fa interessante e vorrei porre alcune domande a
PietroBaima.
Prima di tutto scusami se risulterò confuso o dirò orrori.
Non scusarti.
Lo scopo del forum e' proprio quello di porre delle domande e di ricevere delle risposte.
Non preoccuparti della qualita' della domanda, qualunque essa sia sta a me trovare il modo di dire qualcosa di interessante (o almeno, insomma, provarci

)
Ci mancherebbe che una persona che ha una curiosita' debba scusarsi...
Dovrebbero scusarsi coloro che si divertono a fare perdere tempo al forum facendo i troll o semplicemente i somari, come dice
Candy, perche' il tempo che i moderatori perdono nel star loro dietro potrebbero usarlo per rispondere a domande o comunque a fare qualcosa di piu' gradevole.
Anyway, lasciamo perdere, non voglio fare polemiche.
paofanello ha scritto:Mi piacerebbe molto quindi se tu potessi un poco
illuminarci
lelerelele ha scritto:Il circuito l'ho gia realizzato e funzionante, se hai tempo, senza fretta e senza impegno, riesci a darmi due righe di codice in C che realizzi il calcolo te ne sono grato, mi permette di capire qualcosa in più di matematica e di programmazione
Va bene, dato che interessa ad entrambi vediamo come funziona il metodo di Orchard (e anche cos'e'

)
paofanello ha scritto:Per la ricerca del polinomio mi è capitato sempre e solo di utilizzare lo sviluppo in serie di Taylor, ed ho sempre dato per scontato che si utilizzasse sempre questo al di là di casi particolari, è corretto?
Mi sa che qui c'e' un poco di confusione.
Allora, Taylor si usa per trovare una approssimazione polinomiale di una certa funzione in un punto stabilito.
Non e' l'unico metodo esistente per approssimare delle funzioni (vedi i vari Bessel, Chebishev, Butterworth e molti altri). Il suo limite piu' grande e' che l'approssimazione e' locale (bisogna trovare un punto dal quale non ci si puo' discostare molto).
In generale, volendo approssimare una funzione, di una certa complessita', in un certo intervallo, con un certo errore massimo, trovare il punto intorno al quale approssimare con Taylor e' molto complicato.
L'idea e' quella di trovare un punto, nell'intervallo, in cui centrare lo sviluppo, per poi allargarlo ad un intorno senza commettere un errore superiore a quello prefissato.
Comunque, nel nostro caso della pressione atmosferica, Taylor va benissimo.
Il metodo di Orchard si utilizza quando si e' gia' trovato il polinomio
con un metodo qualunque e serve per valutare quel polinomio in un punto, in modo computazionalmente efficiente.
Supponiamo di avere il polinomio

e di doverlo valutare in x=5.
Il primo metodo che ci viene in mente e' quello di elevare al quadrato 5, sommarlo a 5 moltiplicato 2 e infine sommare 3.
Se il polinomio e' di grado elevato bisogna fare elevamenti a potenza con esponenti grandi e questo e' computazionalmente molto gravoso.
Orchard ha inventato un metodo per risolvere questo problema in modo molto efficiente.
Quindi il metodo di Orchard non c'entra col metodo utilizzato per trovare il polinomio.
paofanello ha scritto:perché consigli l'utilizzo di questo metodo di Orchard?
Perche' e' un metodo efficiente.
paofanello ha scritto:Che problema ha la diretta implementazione di un polinomio di Taylor nel micro?
Il polinomio di Taylor in se nessuna, la sua valutazione in un punto e' fonte di guai di complessita' computazionale e, come vedremo anche di guai dal punto di vista del condizionamento del problema.
paofanello ha scritto:Non porterebbe vantaggi in termini di memoria delle variabili?
No, al contrario.
Metodo di OrchardSupponiamo di voler calcolare il valore di un polinomio P(x) per un certo x assegnato.
Il problema e' quindi calcolare

In generale il polinomio e':

E' possibile scrivere il polinomio in questa forma:

Per verificarne l'uguaglianza basta notare che il termine

viene moltiplicato per x n volte, mentre

e' moltiplicato per x una volta in meno e cosi' via.
A questo punto e' possibile notare che questo modo di scrivere il polinomio nasconde un metodo iterativo, che posso utilizzare per valutare il polinomio stesso in un punto, assegnando x :

vediamo cosa succede, "srotolando il ciclo" per un po':



...
alla fine, dopo n passaggi, il polinomio sara' valutato per l'x assegnato, senza fare alcun elevamento a potenza, ma solo n moltiplicazioni !
Esempio:

- Codice: Seleziona tutto
unsigned long int Polinom(unsigned long int x)
{
const int a[]={1,4,0,-3,8,-3};
const char loa=6;
unsigned long int s=0;
int k=0;
for(k=0;k<loa;s=s*x+a[k++]);
return (s);
}
C'e' ancora un problema, pero'. Il condizionamento numerico.
Quando si approssima una funzione usando un polinomio succede che il termine del grado piu' alto e' piccolo rispetto a quello del grado immediatamente precedente, il quale e' piu' piccolo del termine ancora precedente, e cosi' via...
Questo succede perche' i termini di grado piu' alto del polinomio fungono da "rifiniture" per la funzione, mentre i termini di grado piu' basso ne definiscono la struttura.
Per fare un esempio di vettore a[], potrei per esempio scrivere:
a[]={0.00001,2,89,234}
Fra il primo e l'ultimo termine ci sono diversi ordini di grandezza e questo fa si' che la macchina potrebbe non riuscire a mantenere la precisione durante le moltiplicazioni, generando un ulteriore rumore numerico che potrebbe peggiorare il risultato.
Tenere un vettore bilanciato fa si' che la precisione aumenti.
Questi problemi si chiamano problemi di condizionamento.
Sono problemi che non esisterebbero se si potesse avere una macchina in grado di fare calcoli con una precisione infinita, quindi non si incontrano mai durante il calcolo teorico.
Per risolvere questo problema e' sufficiente correggere il metodo iterativo in questo modo:

Orchard penso' di introdurre una costante nota 10^p ad ogni iterazione.
Vediamo cosa succede all'algoritmo:



...

In pratica ogni termine viene moltiplicato per una potenza pari al grado del termine moltiplicata per il p preassegnato.
Se poniamo p=0 torniamo ad avere l'algoritmo precedente, quindi questo ne e' una estensione.
Nell'esempio in cui il vettore a era a[]={0.00001,2,89,234}, se poniamo p=-2, abbiamo il termine di ordine 3 diviso per un milione, quello di ordine 2 diviso per diecimila, quello di ordine 1 diviso per cento. (il termine noto non viene diviso, o meglio, viene diviso per uno).
Per conservare l'uguaglianza il vettore a[] va scritto quindi cosi':
a[]={10,20000,8900,234}
Prima fra termine piu' piccolo e piu' grande c'era un divario di 7 ordini di grandezza, ora di 3.
Il condizionamento del problema e' migliorato, inoltre, usando bene questo trucco, possiamo moltiplicare il vettore per delle potenze di dieci e quindi utilizzare la virgola fissa invece della virgola mobile.
In campo professionale si usa sempre questo metodo per fare le valutazioni rapide di modelli polinomiali.
Questo e' il metodo di Orchard, domani vediamo come applicarlo al caso specifico!
Ciao,
Pietro.
PS: "esercizio per il volenteroso lettore": se invece di avere

avessi

quale sarebbe il polinomio risultante?