- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2015-04-15 01:04 编辑
a hard way ~
f(x) = (17.800935828877)*x**2 + (7.19552718360075)*x
- #!/usr/bin/perl
- # queke:
- # gnuplot> f(x) = (17.800935828877)*x**2 + (7.19552718360075)*x
- # gnuplot> plot 'data' with points ps 3 pt 7, f(x) lw 5
- use 5.016;
- my ( $M, $Y );
- while (<DATA>) {
- my ( $x, $y ) = split;
- push @$Y, [$y];
- push @$M, [ $x, $x * $x ];
- }
- sub gimme {
- my ( $M, $Y ) = @_;
- my $TM = T($M);
- my @A = map $_->[0], @{ M( I( M( $TM, $M ) ), M( $TM, $Y ) ) };
- "f(x) = ($A[1])*x**2 + ($A[0])*x";
- }
- my $fx = gimme $M, $Y;
- say $fx;
- sub T {
- my $m = shift;
- my @M = map {
- my $i = $_;
- [ map { $m->[$_][$i] } 0 .. $#$m ]
- } 0 .. $#{ $m->[0] };
- [@M];
- }
- sub M {
- my ( $A, $B ) = @_;
- my @M = map {
- my $i = $_;
- my @S = map {
- my ( $j, $S ) = $_;
- $S += $A->[$i][$_] * $B->[$_][$j] for 0 .. $#{$B};
- $S;
- } 0 .. $#{ $B->[0] };
- [@S]
- } 0 .. $#{$A};
- [@M];
- }
- sub I {
- my @m = @{ +shift };
- for my $i ( 0 .. $#m ) {
- my $it = 1.0 / $m[$i][$i];
- $m[$i][$i] = $it;
- for my $j ( 0 .. $#m ) {
- next if $j == $i;
- $m[$i][$j] *= -$it;
- $m[$j][$i] *= $it;
- }
- for my $j ( 0 .. $#m ) {
- next if $j == $i;
- for my $k ( 0 .. $#m ) {
- next if $k == $i;
- $m[$j][$k] += $m[$j][$i] * $m[$i][$k] / $it;
- }
- }
- }
- [@m];
- }
- __DATA__
- 0 0
- 0.05 0.5487
- 0.1 1.0967
- 0.15 1.6447
- 0.2 2.1937
- 0.25 2.7417
- 0.3 3.5587
- 0.35 4.6387
- 0.4 5.7407
- 0.45 6.9717
复制代码 |
|