File: nonsymmetric_eigen_old

package info (click to toggle)
libmath-gsl-perl 0.45-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 192,156 kB
  • sloc: ansic: 895,524; perl: 24,682; makefile: 12
file content (62 lines) | stat: -rwxr-xr-x 1,593 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/perl -w
use Math::GSL          qw/:all/;
use Math::GSL::Eigen   qw/:all/;
use Math::GSL::Matrix  qw/:all/;
use Math::GSL::Vector  qw/:all/;
use Math::GSL::Complex qw/:all/;
use Math::GSL::Errno qw/:all/;
use Math::Complex;
use Data::Dumper;
use strict;
my $matrix = Math::GSL::Matrix->new(2,2)
                              ->set_row(0, [0,-1] )
                              ->set_row(1, [1, 0] );
print <<STUFF;
Finding eigenvalue/eigenvectors for
[ 0  -1 ]
[ 1   0 ]
STUFF

my $evec   = gsl_matrix_complex_alloc(2,2);
my $eigen  = gsl_eigen_nonsymmv_alloc(2);
my $vector = gsl_vector_complex_alloc(2);

# this actually computes the eigenvalues and vectors
gsl_eigen_nonsymmv($matrix->raw,$vector, $evec, $eigen);

my $x = gsl_vector_complex_real($vector);
my $y = gsl_vector_complex_imag($vector);

my $eig1 = as_complex( gsl_vector_get($x->{vector}, 0) ,  gsl_vector_get($y->{vector}, 0) );
my $eig2 = as_complex( gsl_vector_get($x->{vector}, 1) ,  gsl_vector_get($y->{vector}, 1) );

my $u1 = as_complex( gsl_matrix_complex_get($evec, 0, 0) );
my $u2 = as_complex( gsl_matrix_complex_get($evec, 1, 0) );
my $v1 = as_complex( gsl_matrix_complex_get($evec, 0, 1) );
my $v2 = as_complex( gsl_matrix_complex_get($evec, 1, 1) );

print <<ANSWER;

Eigenvectors:

u = ($u1,$u2)
v = ($v1,$v2)

Eigenvalues:

lambda_0 = $eig1
lambda_1 = $eig2

ANSWER

sub as_complex {
    my ($w,$v) = @_;
    my ($x,$y);
    if( ref $w ) {
        ($x,$y) = (gsl_real($w),gsl_imag($w));
    } else {
        ($x,$y) = ($w,$v);
    }
    my $z      = Math::Complex->make( $x, $y);
    return qq{$z};
}