View Full Version : arcoseno e arcocoseno... devo implementarli...
sblantipodi
18-05-2008, 18:32
Salve,
ho bisogno di un metodo per calcolare l'arcoseno e l'arcocoseno per tirar fuori i gradi di un angolo avendo a disposizione
seno e coseno.
In java abbiamo dei metodi come asin e acos ma io sto sviluppando in JavaME e la classe Math di JavaME non include questi metodi...
Come posso implementare questi metodi avendo a disposizione solo cos, sin e tan?
Usare una libreria esterna è escluso.
Qualche idea?
Salve,
ho bisogno di un metodo per calcolare l'arcoseno e l'arcocoseno...
In java abbiamo dei metodi come asin e acos ma io sto sviluppando in JavaME e la classe Math di JavaME non include questi metodi...
Come posso implementare questi metodi avendo a disposizione solo cos, sin e tan?
Usare una libreria esterna è escluso.
Qualche idea?
non sono 1/sin e 1/cos?? :confused:
wingman87
18-05-2008, 18:37
Puoi usare lo sviluppo in serie di Taylor: LINK (http://it.wikipedia.org/wiki/Serie_di_Taylor)
sblantipodi
18-05-2008, 18:51
non sono 1/sin e 1/cos?? :confused:
ehm... si ma il calcolo non va fatto in questo modo...
sin^-1 x != 1/(sin x)
purtroppo :(
Puoi usare lo sviluppo in serie di Taylor: LINK (http://it.wikipedia.org/wiki/Serie_di_Taylor)
avevo dimenticato di dire che nn posso usare taylor perchè l'approssimazione è troppo imprecisa e l'algoritmo troppo inefficiente...
sto sviluppando su un telefono che deve aggiornare questi valori ogni ottavo di secondo
con una svg che deve muoversi di conseguenza... taylor non mi sembra il caso :)
so che c'è un'alternativa in quanto le funzioni asin e acos di JavaSE utilizzano algoritmi molto + efficienti e precisi di taylor,
solo che non riesco a trovarli :(
wingman87
18-05-2008, 18:59
La precisione in Taylor è arbitraria, l'unico problema può essere l'inefficienza... Comunque se usassi Taylor per migliorare l'efficienza potresti calcolarti a priori i coefficienti delle x^(2n+1). Di più non so aiutarti, mi dispiace
non sono 1/sin e 1/cos?? :confused:
Purtroppo quelle sono le "sfigatissime" secante e cosecante... peraltro penso che ogni calcolatrice (e persino le funzioni di libreria) usino algoritmi basati sulla formula di Taylor per il calcolo delle funzioni trigonometriche, esponenziali, logaritmiche... quindi dovrebbe essere un buon compromesso.
Salve,
ho bisogno di un metodo per calcolare l'arcoseno e l'arcocoseno...
In java abbiamo dei metodi come asin e acos ma io sto sviluppando in JavaME e la classe Math di JavaME non include questi metodi...
Come posso implementare questi metodi avendo a disposizione solo cos, sin e tan?
Usare una libreria esterna è escluso.
Qualche idea?
L'unica alternativa che conosco (o meglio, di cui ho sentito parlare ) alle serie di potenze sono gli algoritmi CORDIC http://en.wikipedia.org/wiki/CORDIC, ma in teoria non dovrebbe essere piu' veloce, di solito sono usati su hw che non dispone di particolari operazioni (FPGA ad esempio).
Ho comunque trovato in questa pagina
http://www.shellandslate.com/computermath101.html
una implementazione (in C++) dell'atan2. Non mi sembra complessa, potresti vedere se riesci a farne una trasposizione in Java.
Occhio che per quel che mi riguarda potrebbe essere sballata o implementare la radice quadrata :D, YMMV
potresti usare il metodo di newton (http://it.wikipedia.org/wiki/Metodo_delle_tangenti)
sblantipodi
18-05-2008, 22:20
:eek: :doh:
ndakota stava semplicemente chiedendo non c'è bisogno di fare quelle facce.
giusto per la precisione, noi scriviamo sin^-1 e cos^-1 in modo tale da indicare tali funzioni, ma rigorosamente è una notazione sbagliata, si dovrebbe scrivere sempre e solo asin e acos...;)
se vuoi essere così preciso xchè non proponi una soluzione valida? :D
ho trovato questa libreria http://www.sfc.wide.ad.jp/~nandu/ipl1bc00/lejosAPI/apidocs/java/lang/Math.html forse ti può interessare come è implementata http://www.sfc.wide.ad.jp/~nandu/ipl1bc00/lejos.tar.gz
khelidan1980
18-05-2008, 22:54
ndakota stava semplicemente chiedendo non c'è bisogno di fare quelle facce.
se vuoi essere così preciso xchè non proponi una soluzione valida? :D
non credo ci sia alternativa,si deve scrivere arcocoseno e arcoseno,sulle calcolatrici scrivono con il sin^-1 infatti non si capisce,almeno io non mi ricordavo mai se intendevano 1/sin oppure arcoseno!
Comunque confermo che le calcolatrici usano lo sviluppo di Taylor,i prof di Analisi lo diceva sempre
Salve,
ho bisogno di un metodo per calcolare l'arcoseno e l'arcocoseno...
In java abbiamo dei metodi come asin e acos ma io sto sviluppando in JavaME e la classe Math di JavaME non include questi metodi...
Come posso implementare questi metodi avendo a disposizione solo cos, sin e tan?
Usare una libreria esterna è escluso.
Qualche idea?
Per inciso, ti e' proprio necessario usare arcoseno e compagnia ? In molti casi e' possibile farne a meno e ricorrere a un po' di sana algebra lineare
(mi sono imbattutto in una questione analoga dovendo implementare delle trasformazioni un CUDA dove anche li' quelle funzioni mancano)
DanieleC88
18-05-2008, 23:18
Non so se può interessare...
http://discussion.forum.nokia.com/forum/showthread.php?t=72840
La classe Math di Java si appoggia a delle librerie matematiche scritte in C (credo della stessa Sun): ftp://ftp.netlib.org/fdlibm.tar
forse può esserti utile
Mi sembra che sia possibile richiamare funzioni scritte in C in un metodo Java tramite la keyword "native", ma il procedimento esatto purtroppo non lo conosco
Se hai almeno l'arcotangente ATN, allora puoi usare le seguenti:
http://upload.wikimedia.org/math/7/9/e/79edd4f7f1346c32853fc9facae7f0bf.png
http://upload.wikimedia.org/math/8/c/c/8ccb36a0e1e4ffb05975a627bf5472c4.png
Comunque quoto, sia nelle calcolatrici che anche nei nostri stessi coprocessori matematici, le funzioni matematiche che non siano somma prodotto etc. vengono risolte con McLaurin o Taylor.
L'ordine di grandezza dell'algoritmo con una precisione sufficiente e' inferiore ai 200 cicli di clock, quindi 0.2 secondi oggi e' un'infinita'.
variabilepippo
19-05-2008, 08:27
Clicca QUI (http://henson.newmail.ru/j2me/Float11.htm)
@khelidan1980&Antonio23
in realtà la notazione sin^-1 è corretta e significa funzione inversa del seno
anche wikipedia lo sa http://it.wikipedia.org/wiki/Funzione_inversa :D
DanieleC88
19-05-2008, 08:43
Sì, è "corretta", ma crea confusioni, come ben vedi. :p
Figo il link russo... :D
maledetti programmatori russi :asd:
DanieleC88
19-05-2008, 08:50
// check up the invertation
Decisamente. :asd:
sblantipodi
19-05-2008, 10:58
Risolto, grazie lo stesso a tutti...
Credo che questo sia il metodo + elegante, preciso ed efficiente.
public double aTan2(double y, double x) {
double coeff_1 = Math.PI / 4d;
double coeff_2 = 3d * coeff_1;
double abs_y = Math.abs(y);
double angle;
if (x >= 0d) {
double r = (x - abs_y) / (x + abs_y);
angle = coeff_1 - coeff_1 * r;
} else {
double r = (x + abs_y) / (abs_y - x);
angle = coeff_2 - coeff_1 * r;
}
return y < 0d ? -angle : angle;
}
Ma non ti servivano ArcCos e ArcSin?
dicamo che non lo è fino in fondo... dato che seno e coseno non sono funzioni invertibili in tutto il loro dominio :-)
facciamo i pignoli.. la notazione non cambia nemmeno per funzioni invertibili solo in un intervallo
Ma non ti servivano ArcCos e ArcSin?
si ricavano dall'arcotangente
si ricavano dall'arcotangente
E infatti, l'ho scritto nel mio primo post, ma serve la radice quadrata (almeno, non so se ci sono altri metodi)
sarei interessato all'arcocoseno, ma nn ho capito come hai risolto il problema. mi potresti spiegare?
grazie
sblantipodi
12-06-2008, 10:29
sarei interessato all'arcocoseno, ma nn ho capito come hai risolto il problema. mi potresti spiegare?
grazie
Se guardi qualche post + in alto ho postato lo spezzone di codice che risolve il problema... Imho nel migliore dei modi...
Se qualcuno è interessato vi posto un link al prodotto finito linkando al sito ufficiale:
http://www.dpsoftware.org/pocket_inclinometer.php
Qui qualche screenshot del software:
http://www.dpsoftware.org/screenshot_pi.php
Qui un video del software in azione su un SonyEricsson K850i:
http://www.youtube.com/watch?v=V-CsoHxeaSE
e qui il thread ufficiale sul software:
http://www.hwupgrade.it/forum/showthread.php?t=1754942
si visto che c'è l'arcotangente, ma nn mi è chiaro come si ricava l'arcoseno.
marko.fatto
12-06-2008, 10:43
si visto che c'è l'arcotangente, ma nn mi è chiaro come si ricava l'arcoseno.
Se hai almeno l'arcotangente ATN, allora puoi usare le seguenti:
http://upload.wikimedia.org/math/7/9/e/79edd4f7f1346c32853fc9facae7f0bf.png
http://upload.wikimedia.org/math/8/c/c/8ccb36a0e1e4ffb05975a627bf5472c4.png
Comunque quoto, sia nelle calcolatrici che anche nei nostri stessi coprocessori matematici, le funzioni matematiche che non siano somma prodotto etc. vengono risolte con McLaurin o Taylor.
L'ordine di grandezza dell'algoritmo con una precisione sufficiente e' inferiore ai 200 cicli di clock, quindi 0.2 secondi oggi e' un'infinita'.
:stordita:
emmm.. la arctan prende due paremetri.
io devo fare questo:
http://upload.wikimedia.org/math/7/6/c/76c95c059f69440389784834a511630c.png
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.