Funzione ipergeometrica di Gauss
Sto cercando di creare un codice in C per il calcolo della funzione ipergeometrica $2F1$ di Gauss (che mi servirà come parte di un programma più grande).
A quanto ho visto non è una cosa semplice; ho trovato però un suggerimento in un vecchio numerical recipes, ma non riesco a trovare la libreria complex.h. Qualcuno sa farmela trovare? Grazie.
A quanto ho visto non è una cosa semplice; ho trovato però un suggerimento in un vecchio numerical recipes, ma non riesco a trovare la libreria complex.h. Qualcuno sa farmela trovare? Grazie.
Risposte
ciao,
che compilatore utilizzi? (gcc, qualche IDE con compilatore interno?)
questo perchè complex.h mi pare essere dello standard C99 e se fosse questo il caso, dovresti dire al compilatore che standard tu stia utilizzando (oppure c'è un tag da inserire per dire al linker che utilizzi questa libreria).
Dicci il compilatore che usi, poi vediamo
che compilatore utilizzi? (gcc, qualche IDE con compilatore interno?)
questo perchè complex.h mi pare essere dello standard C99 e se fosse questo il caso, dovresti dire al compilatore che standard tu stia utilizzando (oppure c'è un tag da inserire per dire al linker che utilizzi questa libreria).
Dicci il compilatore che usi, poi vediamo

Ciao, grazie della risposta.
Alla fine questo problema l'ho risolto; il fatto era che il libro è stato scritto prima che complex.h rientrasse nello standard, e quindi usava un header un po' diverso, creato appositamente.
Purtroppo però il programma per il calcolo della funzione ipergeometrica pare essere piuttosto complicato e ancora non sono riuscito a terminarlo. Se qualcuno si ritrovasse un codice già fatto, preferibilmente in C, o conoscesse un codice relativamente semplice, sarei contento mi informasse. Grazie.
Alla fine questo problema l'ho risolto; il fatto era che il libro è stato scritto prima che complex.h rientrasse nello standard, e quindi usava un header un po' diverso, creato appositamente.
Purtroppo però il programma per il calcolo della funzione ipergeometrica pare essere piuttosto complicato e ancora non sono riuscito a terminarlo. Se qualcuno si ritrovasse un codice già fatto, preferibilmente in C, o conoscesse un codice relativamente semplice, sarei contento mi informasse. Grazie.
Le funzioni della libreria GSL (GNU Scientific Library) le hai già viste? Sono scritte in C ed open source.
C'è anche quella che cerchi: http://www.gnu.org/software/gsl/manual/ ... tions.html
considera che sono librerie per sistemi *nix e dovrai modificarle nei tuoi casi. Ho cercato per pochi secondi perciò forse c'è qualcos'altro.
vedi se ti è utile per il momento
other in Python: https://github.com/sympy/sympy/blob/mas ... l/hyper.py
C'è anche quella che cerchi: http://www.gnu.org/software/gsl/manual/ ... tions.html
considera che sono librerie per sistemi *nix e dovrai modificarle nei tuoi casi. Ho cercato per pochi secondi perciò forse c'è qualcos'altro.
vedi se ti è utile per il momento

other in Python: https://github.com/sympy/sympy/blob/mas ... l/hyper.py
Perfetto, darò un'occhiata pure a quelle.
Nel frattempo, facendo delle prove con wolphram alpha
(http://www.wolframalpha.com/input/?i=2F ... 3B3%3B5%29)
mi sono imbattuto in risultati dubbi. E' mai possibile, per come è definita la funzione, che introducendo parametri reali, il risultato abbia una parte immaginaria? Mi pare di no, eppure questo è quanto risulta.
Provare ad esempio ad inserire 2F1(1,2;3;5)
Nel frattempo, facendo delle prove con wolphram alpha
(http://www.wolframalpha.com/input/?i=2F ... 3B3%3B5%29)
mi sono imbattuto in risultati dubbi. E' mai possibile, per come è definita la funzione, che introducendo parametri reali, il risultato abbia una parte immaginaria? Mi pare di no, eppure questo è quanto risulta.
Provare ad esempio ad inserire 2F1(1,2;3;5)
Bella scoperta la GSL! L'ho subito installata. Tuttavia ha la limitazione che la 2F1(a,b;c;x) la calcola solo per |x|<1.
Comunque quanto trovato forse potrebbe bastarmi.
Un'altra funzione che mi servirebbe computare è l'ipergeometrica F1 di Appell, che non mi pare sia nella GSL. Finora ho trovato solo qualche riferimento in Fortran. Come prima, sono graditi suggerimenti. Grazie.
Comunque quanto trovato forse potrebbe bastarmi.
Un'altra funzione che mi servirebbe computare è l'ipergeometrica F1 di Appell, che non mi pare sia nella GSL. Finora ho trovato solo qualche riferimento in Fortran. Come prima, sono graditi suggerimenti. Grazie.
"robbstark":
Nel frattempo, facendo delle prove con wolphram alpha
(http://www.wolframalpha.com/input/?i=2F ... 3B3%3B5%29)
mi sono imbattuto in risultati dubbi. E' mai possibile, per come è definita la funzione, che introducendo parametri reali, il risultato abbia una parte immaginaria? Mi pare di no, eppure questo è quanto risulta.
Provare ad esempio ad inserire 2F1(1,2;3;5)
ho dato un'occhiata ed hai ragione.
La causa penso sia che Wolfram, come ogni sistema computazionale, utilizzi degli accrocchi di approssimazione. Immagina poi che deve darti una risposta in un tempo fissato essendo una fonte web e questo causa errori, si dice che se un tal algoritmo se viene interroto dopo un certo tempo ha la proprietà Any Time, cioè da una soluzione paraziale accettabile dopo un certo numero di iterazioni.
Un ipotesi ulteriore è che wolfram o la funzione ipergeometrica abbia senso anche nel campo complesso, cioè abbia soluzioni anche in questo campo oppure si utilizzino delle proprietà proprie per ridurre il numero di operazioni.
Dopo questo discorso meramente opinionista e delirante, per quanto diguarda la seconda funzione che cerchi ho trovato questo: f1: a code to compute Appell's F1 hypergeometric function ed il relativo codice reperibile qui. Purtroppo è codice FORTRAN 90.
se ti sembra ok e non hai accesso a sciencedirect.com posso passarti il Paper

oppure mi pare sia più aggiornato e reperibile qui: http://cran.r-project.org/web/packages/appell/
other in Python:
http://mpmath.googlecode.com/svn/tags/0 ... l#appellf1
se ti son utili

Grazie, credo mi torneranno utili questi link, anche se alcuni li avevo già trovati.
Allora, sta risultando un'ardua impresa venirne a capo, ma se e quando ci riuscirò ci sarà più gusto.
Adesso vorrei confrontare i risultati dei miei codici per le funzioni di Appell con i risultati più affidabili che si trovano online.
Mi risulta che Wolphram Alpha computi solo la F1; ho trovato un altro calcolatore di funzioni speciali che invece calcola anche le altre funzioni di Appell ma fallisce vicino ai bordi della zona di convergenza della serie, e soprattutto fuori dalla zona di convergenza (prolungamenti analitici).
Adesso vorrei confrontare i risultati dei miei codici per le funzioni di Appell con i risultati più affidabili che si trovano online.
Mi risulta che Wolphram Alpha computi solo la F1; ho trovato un altro calcolatore di funzioni speciali che invece calcola anche le altre funzioni di Appell ma fallisce vicino ai bordi della zona di convergenza della serie, e soprattutto fuori dalla zona di convergenza (prolungamenti analitici).
Sto cercando qualche formula relativa preferibilmente alla $F_1$ di Appell, ma eventualmente anche la $F_2$ di Appell o la $G_2$ di Horn, che mi dica come comportarmi in qualche caso particolare.
In pratica ho notato che mi trovo spesso a che fare con:
$F_1(0.5, b, 0.5, 0.5, x, y)$ fuori dalla zona di convergenza della serie.
In questo caso il codice che uso richiede di calcolare la funzione:
$G_2(a, 1, 1, -0.5, x, y)$ (non intendo che $x$ e $y$ siano uguali a quelli di prima), la quale a sua volta mi chiede di calcolare:
$F_2(0.5, b, 1, 0, 1.5, x, y)$.
Quel $d=0$ crea problemi perché è associato a un simbolo di Pochhammer che si annulla al denominatore, facendo divergere tutto.
Tuttavia, ho verificato con Wolphram Alpha che la $F_1$ di partenza converge. Devo quindi trovare una formula particolare che mi permetta di trattare casi tipo questo a parte.
Le formule che ho trovato online sono però troppo restrittive, in quanto sostanzialmente mi vincolano più parametri del dovuto. Non esiste magari una fonte specializzata sulle funzioni di Appell o su quelle di Horn? (Lo stesso handbook of mathematical functions di Abramowitz and Stegun, mi sembra carente proprio su queste funzioni)
In pratica ho notato che mi trovo spesso a che fare con:
$F_1(0.5, b, 0.5, 0.5, x, y)$ fuori dalla zona di convergenza della serie.
In questo caso il codice che uso richiede di calcolare la funzione:
$G_2(a, 1, 1, -0.5, x, y)$ (non intendo che $x$ e $y$ siano uguali a quelli di prima), la quale a sua volta mi chiede di calcolare:
$F_2(0.5, b, 1, 0, 1.5, x, y)$.
Quel $d=0$ crea problemi perché è associato a un simbolo di Pochhammer che si annulla al denominatore, facendo divergere tutto.
Tuttavia, ho verificato con Wolphram Alpha che la $F_1$ di partenza converge. Devo quindi trovare una formula particolare che mi permetta di trattare casi tipo questo a parte.
Le formule che ho trovato online sono però troppo restrittive, in quanto sostanzialmente mi vincolano più parametri del dovuto. Non esiste magari una fonte specializzata sulle funzioni di Appell o su quelle di Horn? (Lo stesso handbook of mathematical functions di Abramowitz and Stegun, mi sembra carente proprio su queste funzioni)