数值分析(php实现)二:线性方程组的两个解法

本文介绍使用两种迭代方法求解线性方程组:高斯-塞德尔迭代法与雅可比迭代法。通过PHP实现这两种算法,并展示具体的计算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实这个程序是早就写好的,只不过一直没有时间写上来.
这两个程序都是通过迭代的方法得到线性方程组的解的方法,一个是高斯-塞德尔迭代法,一个是雅可比迭代法

<?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();
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值