2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Работает ли код корректно?
Сообщение22.06.2014, 20:57 
Дан двумерный массив (матрица) размером NxN.Реализовать функцию диагонализации матрицы методом Гаусса.Преобразовать матрицу.
Работает ли код корректно?
Код F#
Код:
//open Microsoft.FSharp.Math
//let rnd = System.Random()
#r "FSharp.PowerPack.dll"
//let A = Matrix.init 2 3 (fun i j -> System.Math.Round(rnd.NextDouble()*10., 0))
//Ввод матрицы.
let m : Matrix<float> = matrix [ [ 1.;2.;3.];[5.;5.;6.];[7.;4.;9.]]
//Функция  диагонализации матрицы методом Гаусса.
let diagonalize (m:Matrix<float>) =
    let nrows = m.NumRows-1
    let ncols = m.NumCols-1
    let norm j =
        (m.Row j) |> Seq.iteri (fun i x -> m.[j,i] <- x / m.[j,j])
    let swaprow i j =
        let r = m.[i..i,0..ncols]
        m.[i..i,0..ncols] <- m.[j..j,0..ncols]
        m.[j..j,0..ncols] <- r
    let rec swapnz i j =
        if j<=nrows then
           if m.[j,i]<>0. then swaprow i j
           else swapnz i (j+1)
    for i = 0 to nrows do
        if m.[i,i]=0. then swapnz i (i+1)
        if m.[i,i]<>0. then
              norm i
              for j = i+1 to nrows do
                  let c = m.[j,i]
                  for k=i to ncols do m.[j,k] <- m.[j,k]-m.[i,k]*c
    m
//Преобразованная матрица 
let m2 = diagonalize (m)


 
 
 
 Re: Работает ли код корректно?
Сообщение22.06.2014, 21:38 
hassword в сообщении #878378 писал(а):
Реализовать функцию диагонализации матрицы методом Гаусса.Преобразовать матрицу.
Работает ли код корректно?

Трудно сказать, корректно ли работает код, решающий заведомо нерешаемую задачу.

 
 
 
 Re: Работает ли код корректно?
Сообщение22.06.2014, 22:16 
ewert в сообщении #878393 писал(а):
решающий заведомо нерешаемую задачу

Это учебный пример кода(ознакомительный так сказать).Книга "Сошников Д. - Функциональное программирование на F#"
Что автор имел ввиду?

 
 
 
 Re: Работает ли код корректно?
Сообщение22.06.2014, 22:41 
hassword в сообщении #878407 писал(а):
Что автор имел ввиду?

Скорее всего, он учил программирование; но математику -- не учил, а всего лишь сдал, и так добросовестно сдал, что себе ничего и не оставил.

Ну не существует метода Гаусса для диагонализации.

 
 
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 06:48 
ewert в сообщении #878428 писал(а):
Ну не существует метода Гаусса для диагонализации.

Я что то не понял вас. Это случаем не приведении матрицы к треугольному виду.

 
 
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 16:17 
Аватара пользователя
ewert
По моему Вы придираетесь. Одно из определений метода Гауса звучит как применение элементарных преобразований для исключения элементов матрицы. Так что метод диагонализации существует. Более того имеет математический смысл, как часть алгоритма поиска определителя матрицы. Правда не имеет практического смысла.

hassword
Нет треугольник и диагональ имеет разные определения. Поэтому код точно неверен.
Проверить можете сами. Возьмите маленькую матрицу и проделайте преобразования вручную. Также выполните программу по шагам. Так же используя свойство элементарных преобразований для проверки результата.

 
 
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 17:08 

(Оффтоп)

Pavia в сообщении #878669 писал(а):
Так что метод диагонализации существует. [...] Правда не имеет практического смысла.

Пусть у нас есть: матрица $M_{m\times n}$, матрица $U_{m\times m}$, "псевдоединичная" матрица $\overline M_{m\times n}$ и перестановочная матрица $P_{n\times n}$ ($m\geqslant n$) такие, что
$$\overline M_{m\times n} = U_{m\times m}\cdot M_{m\times n}\cdot P_{n\times n}.$$
Тогда для решения уравнения $M_{m\times n}\cdot x_{n\times 1}=b_{m\times 1}$ достаточно:

1. Вычислить $y_{m\times 1}=U_{m\times m}\cdot b_{m\times 1}$;
2. Проверить, что $y_{m\times 1}$ заканчивается на нужное количество нулей;
3. Умножить $P_{n\times n}$ на $y_{m\times 1}$, обрезанный до $\widetilde y__{n\times 1}$.

 
 
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 17:11 
Pavia в сообщении #878669 писал(а):
Одно из определений метода Гауса звучит как применение элементарных преобразований для исключения элементов матрицы. Так что метод диагонализации существует. Более того имеет математический смысл, как часть алгоритма поиска определителя матрицы. Правда не имеет практического смысла.

"Они всё путают: и имя, и назва-ания..." (с)

Имеет вполне практический смысл. Да, это элементарные преобразования. И впрямь для устранения чего-то. И не имеют ни малейшего отношения к диагонализации. Которая, да, тоже существует.

 
 
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 20:17 
Pavia в сообщении #878669 писал(а):
hassword
Нет треугольник и диагональ имеет разные определения. Поэтому код точно неверен.

Да вы правы, походу код неверен.
ewert в сообщении #878701 писал(а):
Имеет вполне практический смысл. Да, это элементарные преобразования. И впрямь для устранения чего-то. И не имеют ни малейшего отношения к диагонализации. Которая, да, тоже существует.

Спасибо ewert, буду знать.

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group