[Mathematica] eseguire calcoli con precisione macchina

riuzaky1
Buona sera a tutti, vi faccio i complimenti per il sito (visto che è il mio primo msg su questo forum) mi è stato veramente molto d'aiuto..!
mi trovo in difficoltà con l'utilizzo del programma mathematica e i risultati che le funzioni mi restituiscono.
avrei bisogno di risultati con il massimo numero di cifre ottenibili, ma mathematica mi restituisce massimo 6 cifre per ogni risultato.
vi faccio un esempio, lavorando in matlab se scrivo:
format long e;
A = hilb(10);
l = eigs(A)

l =

    1.751919670265178e+000
    3.429295484835090e-001
    3.574181627163927e-002
    2.530890768670037e-003
    1.287496142763671e-004
    4.729689293123585e-006

ed ogni elemento della variabile "l" contiene 16 cifre che approssimano il numero.
se provo a fare la stessa cosa in mathematica:
A = Table[1/(1 + i + j), {i, 0, 9}, {j, 0, 9}];
l = N[Eigenvalues[A]]

{1.75192, 0.34293, 0.0357418, 0.00253089, 0.00012875, 4.72969*10^-6, 
 1.22897*10^-7, 2.14744*10^-9, 2.26675*10^-11, 1.09315*10^-13}

ed l contiene elementi con sole 6 cifre!
esiste un comando tipo il "format long e" che dice al kernel di trattare i numeri con la massima precisione consentita?

spero di essere stato chiaro..anche se ne dubito un pò :P
aspetto vostre info..grazie per l'attenzione

Risposte
apatriarca

riuzaky1
ok..grazie :) sta cosa mi piace..
ma mettiamo il caso che io volessi indicare la precisione con una funzione non nativa di mathematica ma con una che ho scritto io..come ad esempio potrebbe essere l'algoritmo di forward substitution..dov'è che dovrei indircare la precisione?

ForwardSub[ a0_, b0_, n_ ] :=
  Module[ { a = a0, b = b0, i, j , x},
   x = Table[0, {n}]; 
   For[ i = 1, i <= n, i++,
    x[[i]] = $(b[[i]] - \sum_{j=1}^(i-1) a[[i,j]]*x[[i]])/(a[[i,j]])$
   ];
  Return[x];
 ];


scusate per la sintassi ma non so come scrivere la sommatoria..

modifica: la sommatoria dovrebbe essere questa: x[] = $(b[] - \sum_{j=1}^(i-1) a[[i,j]]*x[])/(a[[i,j]])$
ma all'interno del tag code non la visualizza..!

riuzaky1
ok..scusate...dopo un pò di prove ho visto che funziona anche con le funzioni scritte a mano..
grazie di tutto...post del tutto inutile :P
ciao

riuzaky1
scusate se resuscito il post.
ma ho visto che le potenzialità di matematica sono elevatissime..solo che lo trovo abbastanza scomodo come linguaggio di programmazione.
ho trovato una funzione molto interessante: SetPrecision[f, precisione] che praticamente permette di impostare volta per volta la precisione con la quale deve essere effettuato un calcolo.
se non ho capito male la precisione di default è la MachinePrecision.
utilizzando SetPrecision posso aumentare la MachinePrecision, esempio:
il semplice conto Sqrt[2] * 45 mi restituisce come risultato 63.63961030678928 (praticamente 16 cifre)
se invece eseguo l'operazione in questo modo: SetPrecision[Sqrt[2] * 45, 20] restituisce il risultato 63.639610306789277196 con 20 cifre esatte!

dovendo effettuare molti calcoli diventa scomodo utilizzare SetPrecision[] ogni volta.
c'è un modo per rendere SetPrecision[] permanente per tutta la sessione di lavoro (e quindi per ogni calcolo che verrà effettuato???)

Grazie a tutti per l'attenzione

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