B'; for ($j=1;$j<=$max_j;$j++){echo 'x'.$j.'';} echo '|'; $a=array();for ($i=1;$i<=$max_i;$i++){$a[]=array($i,'|');} $a[]=array(0,'L'); $u2=false;for ($j=0;$j<=$max_j;$j++){if ((int)$x[-1][$j]!==0){$u2=true;$a[]=array(-1,'W');break;} } foreach ($a as $ar){ echo ''.$ar[1].''.(round($x[$ar[0]][0]*100)/100).''; for ($j=1;$j<=$max_j;$j++){ echo ''.(round($x[$ar[0]][$j]*100)/100).''; } echo '|'; } echo ''; } function math_simplex($x, $e, $max_i, $max_j){ global $debug; $hbase=array(null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);// Базовая ли переменная $r =array(null, false, false, false, false, false, false, false, false, false);// Искуственная переменная //Заполняем матрицу и список базовых элементов $x[-1]=array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); for ($i=1;$i<=$max_i;$i++){ if ($e[$i]!==(int)0){ $max_j++;$x[$i][$max_j]=-$e[$i]; if ($x[$i][$max_j]==1){$hbase[$max_j]=$i;continue;} } //Ищем базовые переменные $u=false; for ($j=$max_j;$j>=1;$j--){ if ((int)$x[$i][$j]!==1){continue;} $u1=false;for ($i1=1;$i1<=$max_i;$i1++){if ((int)$x[$i1][$j]!==0 and $i1!==$i){$u1=true;break;}} if (!$u1){$u=true;break;} } if (!$u){ //$max_j++;$x[$i][$max_j]=1;$hbase[$max_j]=$i;$r[$max_j]=true; // echo "Для строки {$i} не найдена базовая переменная {$max_j} _ {$hbase[$max_j]}
"; for ($j2=0;$j2<=$max_j;$j2++){$x[-1][$j2]-=$x[$i][$j2];} }else{ $hbase[$j]=$i; // echo "Для строки {$i} НАЙДЕНА базовая переменная {$j} _ {$hbase[$j]}
"; } } if ($e[0]==0){for ($j=1;$j<=$max_j;$j++){$x[0][$j]=-$x[0][$j];}} // echo $max_i.'; '.$max_j.'
';print_r($hbase);echo '
'; $u=false; for ($j=1;$j<=$max_j;$j++){ if ($hbase[$j]>0 and (int)$x[0][$j]!==0){ if ($debug){ echo "Базовая переменная в уравнении x{$j}; ".(!$u ? 'Оригинальный вариант: ' : ''); if (!$u){$u=true;draw_matrix($x, $hbase, $r, $max_i, $max_j);} } for ($j1=0;$j1<=$max_j;$j1++){ if ($j1==$j){continue;} $x[0][$j1]-=$x[$hbase[$j]][$j1]*$x[0][$j]; } $x[0][$j]=0; } } //$u1=true; //ИТЕРАЦИИ while (true){ if ($debug){echo '
Итерация';draw_matrix($x, $hbase, $r, $max_i, $max_j);} //Выбираем уравнение между W и L $wneed=false; for ($j=0;$j<=$max_j;$j++){if ((int)$x[-1][$j]!==0){$wneed=true;break;}} if ($wneed and $debug){Echo 'Нам до сих пор нужна W
';}; if ($wneed){ //Решаем W $u=false;for ($j=1;$j<=$max_j;$j++){if ($x[-1][$j]<0){$u=true;break;}} // echo '_'.$u.' and '.($x[-1][0]<0).'; '; if (!$u and (int)$x[-1][0]==0){$x[-1]=array(0,0,0,0,0,0,0,0,0,0,0);continue;} if (!$u and $x[-1][0]<0){return null;} $w=-1; }else{ //Решаем L $u=false;for ($i=1;$i<=$max_j;$i++){if ($x[0][$i]<0){$u=true;break;}} if (!$u){return $x[0][0]*($e[0]==1 ? -1 : 1);} $w=0; } if (true){ //Находим ведущий столбец $nv=0;for ($j=1;$j<=$max_j;$j++){ if ($x[$w][$j]<$x[$w][$nv] or $nv==0){$nv=$j;} } if ($debug){echo 'nv='.$nv.' ['.abs($x[$w][$nv]).'];
';} //Находим ведущую строку $nh=0; for ($i=1;$i<=$max_i;$i++){ if ($x[$i][$nv]<=0){continue;} // echo $x[$i][0].'/'.$x[$i][$nv].' = '.($x[$i][0]/$x[$i][$nv]).'; '; if ($nh==0){$d=$x[$i][0]/$x[$i][$nv];$nh=$i;continue;} $d1=$x[$i][0]/$x[$i][$nv]; if ($d1<$d){$nh=$i;$d=$d1;} } if ($nh==0){return 'inf';} if ($debug){echo 'nh='.$nh.' ['.$d.'];
РЭ = '.$x[$nh][$nv].'; ';} //пересчитываем матрицу $x1=$x;$x1[$nh][0]/=$x[$nh][$nv]; for ($j=1;$j<=$max_j;$j++){$x1[$nh][$j]/=$x[$nh][$nv];} for ($i=$w;$i<=$max_i;$i++){ if ($i==$nh){continue;} $x1[$i][0]-=$x[$nh][0]*$x[$i][$nv]/$x[$nh][$nv]; for ($j=1;$j<=$max_j;$j++){ $x1[$i][$j]-=$x[$nh][$j]*$x[$i][$nv]/$x[$nh][$nv]; } } $x=$x1;unset($x1); continue; } exit; //if ($u1){$u1=false;continue;} //echo 'ДЕБАЖНЫЙ ВЫХОД!'; break; } } ?> Симплекс '; echo '';for ($j=1;$j<9;$j++){ echo ''; } echo ''; for ($i=1;$i<10;$i++){ echo ''; for ($j=1;$j<9;$j++){ echo ''; } echo ''; echo ''; } echo '
*x'.$j.'+→
*x'.($j).'+
'; if ($_POST['action']!=='math'){echo '';return;} $x=array();$e=array();$max_i=0;$max_j=0; for ($i=0;$i<10;$i++){ $x[$i]=array(0); for ($j=1;$j<9;$j++){ preg_match('|(\\-?[0-9.]+)|',$_POST['x'.$i.'_'.$j], $a); $x[$i][$j]=(float)$a[1]; if ($x[$i][$j]!==(float)0){$max_i=$i;$max_j=max($j, $max_j);} } $e[$i] =(int)$_POST['e'.$i]; $x[$i][0]=(float)$_POST['y'.$i]; } //echo $max_i.'; '.$max_j.'
';echo '
'; require('./simplex.php'); //Вычисляем $debug=true; echo '

!'.math_simplex($x, $e, $max_i, $max_j).'

'; return; $dx=array( array(20,0,-1,-1,0,0,0), array(20,1,0,1,0,0,0), array( 5,0,1,0,-1,1,0), array(50,0,1,0,0,0,1), ); echo '

'.math_simplex($dx, array(0,0,0,0,0,0,0,0,0,0,0), 3, 6).'

'; ?>