Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6899[/thread]

Math::Trig - Funktionen



<< >> 7 Einträge, 1 Seite
supersucker
 2005-04-16 16:55
#53853 #53853
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi zusammen,

ich hab folgendes problem:

ich hab ein programm geschrieben, dass dreidimensionale molekülberechnungen durchführt, also winkelberechnungen, ebenen usw.

bei einer dieser winkelberechnungen nun verwende ich die umkehrfunktion des cosinus, den arcuscosinus, da es die funktion nicht in perl eingebaut gibt verwende ich die acos-funktion aus dem Math::Trig - Modul und genau da liegt das problem:

Unsinnigerweise nun liefert mir die acos-funktion den arcuscosinus in radiant und nicht in degree, also grad.

hab jetzt schon ne weile gegoogelt wie ich in perl radiant in grad umwandeln kann, aber nix dazu gefunden.

wäre echt dankbar wenn mir da einer weiterhelfen könnte,

danke im voraus
pKai
 2005-04-16 17:09
#53854 #53854
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
[quote=supersucker,16.April.2005, 14:55]Unsinnigerweise nun liefert mir die acos-funktion den arcuscosinus in radiant ...[/quote]
wohl (sinnigerweise) wg cos(acos($x)) == $x ?

Umrechnung radians <-> deg siehe perldoc Math::Trig
I sense a soul in search of answers.
supersucker
 2005-04-16 19:02
#53855 #53855
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
danke soweit,

hätte vielleicht auch mal cpan ein bisschen genauer durchsuchen können, oder matheboards, dann hätt ich gesehen dass man vom bogenmaß zu grad kommt indem man einfach das bogenmaß * 180 nimmt und durch pi teilt......:-)

nun hab ich aber ein anderes problem, dessen ursache mir völlig schleierhaft ist:

führe ich folgendes kleines script aus:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/perl

use Math::Trig qw(tan sec csc cot asin acos atan asec acsc acot sinh cosh tanh sech csch coth asinh acosh atanh asech acsch acoth);

sub RadToDegree()
{
return (($_[0] * 180)/ Math::Trig->pi());
}

my $beta_Angle_Rad = acos(-0.880251132856693);
my $beta_Angle_Deg = &RadToDegree($beta_Angle_Rad);

print "$beta_Angle_Rad\n";
print "$beta_Angle_Deg";


krieg ich die richtigen Werte raus, sowohl für den Winkel in Rad (also bogenmaß) als auch in grad (das wäre 2.64718751654284 für rad und
151.672672277622 grad)

mache ich jedoch GENAU das gleiche in meinem hauptscript, also:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use Math::Trig qw(tan sec csc cot asin acos atan asec acsc acot sinh cosh tanh sech csch coth asinh acosh atanh asech acsch acoth);

sub RadToDegree()
{
return (($_[0] * 180)/ Math::Trig->pi());
}

.................ca 1000 zeilen code..................

my $beta_Angle_Rad = acos(-0.880251132856693);
my $beta_Angle_Deg = &RadToDegree($beta_Angle_Rad);

print "$beta_Angle_Rad\n";
print "$beta_Angle_Deg";


krieg ich die fehlermeldung:

Undefined subroutine &FRAG_LIB::acos called at /root/development/eclipse/eclipse/workspace/PDB_FRAGMENT_LIB/bin/PDBParser.pl line 752, <FILE> line 15082.

rufe ich hingegen die acos-funktion so auf:
Code: (dl )
my $beta_Angle_Rad = Math::Trig->acos(-0.880251132856693);


passiert etwas was ich erst recht nicht verstehe, ich kriege nämlich dann
immer die gleichen falschen werte für RAD und GRAD (immer 90 grad) raus, egal was ich acos übergebe (die funktion wird in einer schleife aufgerufen, bei jedem aufruf übergeb ich der acos-funktion einen anderen wert)

ich bin kein perl-experte, hätte aber gedacht mich mittlerweile in der sprache ganz gut auszukennen, aber mit diesem verhalten kann ich überhaupt gar nichts anfangen und hab nicht die geringste ahnung was da wo falsch läuft.......

ich wäre echt dankbar wenn mir jemand sagen könnte was da nicht passt, bzw. was ich an perl offensichtlich noch nicht verstanden habe.

danke für jede hilfe, micha
pKai
 2005-04-16 22:10
#53856 #53856
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Das klingt mir so, als ob
Quote
use strict;
use warnings;
in dem Skript hilfreich sein könnte!
I sense a soul in search of answers.
pq
 2005-04-17 12:10
#53857 #53857
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=supersucker,16.04.2005, 17:02]
Code: (dl )
my $beta_Angle_Rad = Math::Trig->acos(-0.880251132856693);


passiert etwas was ich erst recht nicht verstehe, ich kriege nämlich dann
immer die gleichen falschen werte für RAD und GRAD (immer 90 grad) raus, egal was ich acos übergebe (die funktion wird in einer schleife aufgerufen, bei jedem aufruf übergeb ich der acos-funktion einen anderen wert)[/quote]
das ist ganz logisch. du rufst hier acos() als klassenmethode auf, wobei
der string "Math::Trig" als erstes argument übergeben wird. mach stattdessen
Math::Trig::acos(...)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
supersucker
 2005-04-17 15:29
#53858 #53858
User since
2005-03-17
118 Artikel
BenutzerIn
[default_avatar]
hi,

vielen dank für die antwort, das hat mein problem gelöst.

noch eine frage aus interesse:

warum macht es einen Unterschied, ob ich die acos-methode mit "->" aufrufe oder mit "::"? ich dachte ich rufe mit beidem die klassenmethode auf....
und warum liefert mir die acos-methode bei aufruf mit "->" immer das erste ergebnis aus der schleife zurück, obwohl ich ihr immer neue werte übergebe?
pq
 2005-04-17 15:42
#53859 #53859
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Math::Trig->acos($x)
# ist gleich
Math::Trig::acos("Math::Trig",$x)

wie gesagt, mit dem pfeil rufst du es als klassenmethode auf ($objekt->acos(...)
ist eine objektmethode, die auf einer instanz aufgerufen
wird), und generell wird bei methoden das ding vor dem pfeil als erstes
argument übergeben.
Math::Trig::acos(...) ist ein einfacher funktionsaufruf.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 7 Einträge, 1 Seite



View all threads created 2005-04-16 16:55.