Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как найти обратную матрицу

Сообщения:  [1-10]   [11-19] 

 
 автор: cheops   (04.01.2012 в 03:03)   письмо автору
 
   для: DEM   (03.01.2012 в 19:23)
 

За одно и перемножение матриц сюда заброшу, чтобы уж все в одном месте было (это для квадратных матриц, для прямоугольных нужно проверять, что там с границами циклов).
<?php
  
function multi($x$y)
  {
    for(
$i 0$i count($x[0]); $i++)
    {
      for(
$j 0$j count($y[0]); $j++)
      {
        for(
$k 0$k count($x[0]); $k++)
        {
          if(!isset(
$z[$i][$j])) $z[$i][$j] = 0;
          
$z[$i][$j] += $x[$i][$k] * $y[$k][$j];
        }
      }
    }
    return 
$z;
  }
?>

  Ответить  
 
 автор: cheops   (04.01.2012 в 02:54)   письмо автору
 
   для: DEM   (03.01.2012 в 23:14)
 

Немного вашу функцию облагорожу (в PHP с памятью проще - можно не копировать результат из единичной матрицы в исходную), чтобы потом на тему можно было ссылаться (мой вариант неправильный результат с первым столбцом выдает - почему-то в обратном порядке его выводит)
<?php
  
function q($matrix)
  { 
    
$a $matrix
    
$e = array(); 
    
$count count($a); 
    for(
$i 0$i $count$i++) 
      for(
$j 0$j$count$j++) 
        
$e[$i][$j] = ($i==$j) ? 0
             
    for(
$i 0$i $count$i++)
    { 
      
$tmp $a[$i][$i]; 
      for(
$j $count 1$j >= 0$j--)
      { 
        
$e[$i][$j] /= $tmp
        
$a[$i][$j] /= $tmp
      } 
         
      for(
$j 0$j $count$j++)
      { 
        if(
$j != $i)
        { 
          
$tmp $a[$j][$i]; 
          for(
$k $count 1$k >= 0$k--)
          { 
            
$e[$j][$k] -= $e[$i][$k]*$tmp
            
$a[$j][$k] -= $a[$i][$k]*$tmp
          } 
        } 
      } 
    } 
     
    return 
$e
  }
?>

  Ответить  
 
 автор: cheops   (04.01.2012 в 02:07)   письмо автору
 
   для: DEM   (04.01.2012 в 01:57)
 

Ага, тоже вручную посчитал, и ваш, и мой алгоритмы дают одно и тоже на простейшей двухмерной матрице.

  Ответить  
 
 автор: DEM   (04.01.2012 в 01:57)   письмо автору
 
   для: DEM   (03.01.2012 в 23:14)
 

Взял, как Вы и сказали массив $b равный единице и постаивл, что бы возвращала матрицу $a. Всё посчиталось правильно.

СПАСИБО БОЛЬШОЕ!!!! :)

  Ответить  
 
 автор: cheops   (04.01.2012 в 01:51)   письмо автору
 
   для: DEM   (04.01.2012 в 01:26)
 

Суть в том, что вы можете подставить вместо $b единицы и в ходе решения должна появится обратная матрица и она вроде появляется, только их перемножение с исходной не дает единичную.

  Ответить  
 
 автор: DEM   (04.01.2012 в 01:45)   письмо автору
 
   для: cheops   (04.01.2012 в 01:37)
 

У меня такое условие задачи:
Есть файл вида:
2 4
1 5
2 7
2 8
3 1
1 7

Это координаты точек (только целые). Надо составить матрицу из расстояния от одной точки до других (первый ряд от первой точки, второй - от второй и т.д.), и ещё добавляется один ряд и столбец в которых элементы равны 1 (кроме диагонального, он равен единице)
Значения там могут быть какие угодно (только не повторяющиеся). В матрице которую я привёл были значения точек:
2 1
2 2


и с ней надо делать всякую фигню, но вот застопорился с ОБРАТНОЙ МАТРИЦЕЙ, всё остальное легко делается...

  Ответить  
 
 автор: cheops   (04.01.2012 в 01:37)   письмо автору
 
   для: DEM   (04.01.2012 в 01:28)
 

>А у моей матрицы все элементы диагонали будут всегда равны 0
Это значения не имет, главное, чтобы детерминант не был равен 0, а метод Гаусса он же строки складывает и вычитает, там от этих нулей в первом же проходе ничего не останется.

Дайте вашу матрицу, если не сложно.

  Ответить  
 
 автор: cheops   (04.01.2012 в 01:35)   письмо автору
 
   для: DEM   (04.01.2012 в 01:26)
 

Эээ... там на хитрость идут, используют все переменные равные 1, поэтому в нормальном алгоритме их даже вычислять не надо.
Слушайте, вы наверное недавно алгебру слушали, правильно я помню, что умножение матрицы на обратную дает единичную матрицу (это собственно и к абзацу выше)? Помоему ни у вас ни у меня ни фига не обратная матрица, перемножаю и матрицы и обратную матрицу на коэффициенты - фигня получается... а должны получаться исходные данные. Ведь метод Гаусса он там не совсем обратную матрицу кажется делает, он делает матрицу треугольной, за счет чего можно быстро получить детерминант, а можно вообще без него...

Вам в любом случае сначала нужно вычислить детерминант - если он 0 дальше считать нет смысла, если он отличен от нуля - обратная матрица есть обязательно, я в принципе с этого и начал, да вот у несло меня в другую степь...

Надо наверное систему попроще брать - двумерную, вычислять вручную и смотреть где и что происходит, а потом уже обощать на трехмерную.

  Ответить  
 
 автор: DEM   (04.01.2012 в 01:28)   письмо автору
 
   для: cheops   (04.01.2012 в 01:17)
 

И у Вас там есть условие:
if($a[$icol][$icol] == 0) return "Матрица сингулярна";


А у моей матрицы все элементы диагонали будут всегда равны 0

  Ответить  
 
 автор: DEM   (04.01.2012 в 01:26)   письмо автору
 
   для: cheops   (04.01.2012 в 01:17)
 

а как мне узнать параметр $b? У меня же просто матрица, а не уравнения...

  Ответить  

Сообщения:  [1-10]   [11-19] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования