dポイントプレゼントキャンペーン実施中!

最小二乗法のプログラムを作ってみたのですが、
これで動きますか??
データを読みとった後から、つまり途中からなのですが・・・
$ndata、$x,$yはデータから読み取った値でこの前で使われています。

#!/usr/bin/perl
# test1.pl
use strict; use warnings;

my $X = $x[$ndata]
my $Y = $y[$ndata]

my $sg =0;
my $sg1 =0;
my $sg2 =0;

for($i; $i < $ndata;$i++;){
$sg1 = $sg1 + ($X)**2;
$sg2 = $sg2 + ($X);
}
$sg = $ndata * $sg1 - ($sg2)**2;


my $a =0;
my $a1 =0;
my $a2 =0;
my $a3 =0;
my $a4 =0;

for($i; $i < $ndata;$i++;){
$a1 = $a1 + ($X)**2;
$a2 = $a2 + ($Y);
$a3 = $a3 + ($X);
$a4 = $a4 + ($X)*($Y);
}
$a = ( $a1*$a2 - $a3*$a4 ) / $sg



my $b =0;
my $b1 =0;
my $b2 =0;
my $b3 =0;
my $b4 =0;

for($i; $i < $ndata;$i++;){
$b1 = $b1 + ($X)*($Y);
$b2 = $b2 + ($X);
$b3 = $b3 + ($Y);
}
$b = ( $ndata*$b1 - $b2*$b3) / $sg


$Y = $a + ($b * $X)

my $sgy =0;
my $sgy1 =0;
my $sgy2 =0;
for($i;$i < $ndata;$i++){
$sgy2 = $sgy2 + ($Y-$a - $b*$X)**2
}
$sgy1 =$sgy2 /($ndata - 2)
$sgy = sqrt( $sgy1 );

my $sga =0;
my $sgb =0;

$sga = $sgy * sqrt( $a1 / $sg )
$sgb = $sgy * sqrt($ndata / $sg )



print "パラメータA=$a,パラメータB=$b./n";
print "Aの誤差は$sga、Bの誤差は$sgb./n";

A 回答 (2件)

え, えぇと.... Perl 以外でプログラムを作った経験はありますか?


for($X; $X < $ndata;$X++;){
$sg1 = $sg1 + ($X)**2;
$sg2 = $sg2 + ($X);
}
がどのように動くか, 理解できていますか?
    • good
    • 0
この回答へのお礼

ありません。。。
ちなみにperlも始めたばかりです。

$xが2乗されて次々に足されるのが$sg1で
$Xがそのまま足されていくのが$sg2

のつもりで作っているのですが。。。

お礼日時:2010/01/19 10:53

や, いくらなんでもこれではだめ. 例えば最初の


for($i; $i < $ndata;$i++;){
$sg1 = $sg1 + ($X)**2;
$sg2 = $sg2 + ($X);
}
の部分だけでも
・$i が初期化されていない
・$X が変化していない
という問題がある.
    • good
    • 0
この回答へのお礼

あっ確かに・・・
$xが変化していないというのはわかります。

$iが初期化されていないというのは
my $i=0;
と最初に書けばよいのでしょうか??(iを変化させたい場合)

for($X; $X < $ndata;$X++;){
$sg1 = $sg1 + ($X)**2;
$sg2 = $sg2 + ($X);
}

と直せばよいのでしょうか??

お礼日時:2010/01/19 00:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!