FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

use Math::Trig qw(acos);

# 三次方程式の解 The Solution Of The Cubic Equation
# 引数 x^3の係数 x^2の係数 xの係数 定数項 ($a, $b, $c, $d)
# 戻り値 三次方程式の解 (@CubicEquation)
sub CUBICEQUATION{
my ($a, $b, $c, $d) = @_;
my @CubicEquation = ();
my $A3 = $a / $a;
my $A2 = $b / $a;
my $A1 = $c / $a;
my $A0 = $d / $a;
my $P = (($A2 * $A2) - (3 *$A1)) / 9;
my $Q = ((2 * ($A2 * $A2 * $A2)) - (9 * $A1 * $A2) + (27 * $A0)) / 54;
my $X1 = 0;
my $X2 = 0;
my $X3 = 0;

# x^3の係数の確認
if($a == 0){
return 0;
}

if((($Q*$Q) - ($P*$P*$P)) < 0){
my $Theta = acos($Q / sqrt($P * $P * $P));
my $Pi = atan2(1, 1) * 4;

# 実数の解
$X1 = (-2 * sqrt($P) * cos($Theta / 3)) - ($A2 / 3);
$X2 = (-2 * sqrt($P) * cos(($Theta + (2 * $Pi)) / 3)) - ($A2 / 3);
$X3 = (-2 * sqrt($P) * cos(($Theta - (2 * $Pi)) / 3)) - ($A2 / 3);
}else {
my $S = (abs($Q) + sqrt(($Q*$Q) - ($P*$P*$P))) ** (1 / 3);
$S = -$S if(0 < $Q);
my $T = ($S != 0 ? ($P / $S) : 0);

# 実数の解
$X1 = ($S + $T) - ($A2 / 3);
if(($S - $T) == 0){
# 実数の解
$X2 = ((-($S + $T) / 2) - ($A2 / 3));
$X3 = "";
}else {
# 虚数の解
$X2 = ((-($S + $T) / 2) - ($A2 / 3)) . " + " . abs((sqrt(3) / 2) * ($S - $T)) . "i";
$X3 = ((-($S + $T) / 2) - ($A2 / 3)) . " - " . abs((sqrt(3) / 2) * ($S - $T)) . "i";
}
}

# 三次方程式の解 The Solution Of The Cubic Equation
$CubicEquation[0] = $X1;
$CubicEquation[1] = $X2;
$CubicEquation[2] = $X3;

return @CubicEquation;
}


参考URL
Cubic function - Wikipedia, the free encyclopedia
三次方程式の解 - 高精度計算サイト
オンライン コンパイラ/インタプリタ
テクニカル分析
プロフィール

Author:雨宮
Firefoxを使用しているので気づかなかったけど、IE6でソースコードを上手くコピーできない

5/3
携帯用ならIE6でもソースコードをコピーできる
携帯用

検索フォーム


あわせて読みたいブログパーツ
一寸先は闇 RSS

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。