数値解析 (php 実装) 2: 線形方程式の 2 つの解
実際、このプログラムはずっと前に書かれたものですが、書く時間がなかっただけです
これらのプログラムは両方とも、反復によって線形方程式の解を求める方法であり、1 つはガウス・ザイデルです。反復法、もう 1 つはヤコビ反復法です
<?php class Gs{ private $matrix; public function __construct($array){ $this->matrix = $array; } public function solve(){ $preX = array(); $nowX = array(); $cishu = 17; $delta = 0.0001; $matN = count($this->matrix); for($i = 0;$i<$matN;$i++){ $preX[$i] = 1; } $min = 100000000; for($n = 0;$n<$cishu;$n++){ for($i = 0;$i<$matN;$i++){//xi $sum1 = 0; $sum2 = 0; for($j = 0;$j < $matN;$j++){ if($j < $i) $sum1 += ($this->matrix[$i][$j] * $nowX[$j]); if($j > $i) $sum2 += ($this->matrix[$i][$j] * $preX[$j]); } $nowX[$i] = ($this->matrix[$i][$matN] - $sum1 - $sum2)/$this->matrix[$i][$i]; $tempMin = $nowX[$i] > $preX[$i] ? $nowX[$i]-$preX[$i]:$preX[$i]-$nowX[$i]; if($min > $tempMin) $min = $tempMin; } $preX = $nowX; $str = implode(",",$nowX); echo ($n+1).":($str)"."<br>"; if($min < $delta) break; } } } $a = array( array(5,2,1,-12), array(-1,4,2,20), array(12,-3,10,3) ); $x = new Gs($a); $x->solve(); ?>
<?php class Yacobi{ private $matrix; public function __construct($array){ $this->matrix = $array; } public function solve(){ $preX = array(); $nowX = array(); $cishu = 17; $matN = count($this->matrix); for($i = 0;$i<$matN;$i++){ $preX[$i] = 1; } for($n = 0;$n<$cishu;$n++){ for($i = 0;$i<$matN;$i++){//xi $sum = 0; for($j = 0;$j < $matN;$j++){ if($j != $i) $sum += ($this->matrix[$i][$j] * $preX[$j]); } $nowX[$i] = ($this->matrix[$i][$matN] - $sum)/$this->matrix[$i][$i]; } $preX = $nowX; $str = implode(",",$nowX); echo ($n+1).":($str)"."<br>"; } } } $a = array( array(5,2,1,-12), array(-1,4,2,20), array(12,-3,10,3) ); $x = new Yacobi($a); $x->solve(); ?>