2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Работает ли код корректно?
Сообщение22.06.2014, 20:57 


17/05/13
160
Дан двумерный массив (матрица) размером 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 
Заслуженный участник


11/05/08
32166
hassword в сообщении #878378 писал(а):
Реализовать функцию диагонализации матрицы методом Гаусса.Преобразовать матрицу.
Работает ли код корректно?

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

 Профиль  
                  
 
 Re: Работает ли код корректно?
Сообщение22.06.2014, 22:16 


17/05/13
160
ewert в сообщении #878393 писал(а):
решающий заведомо нерешаемую задачу

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

 Профиль  
                  
 
 Re: Работает ли код корректно?
Сообщение22.06.2014, 22:41 
Заслуженный участник


11/05/08
32166
hassword в сообщении #878407 писал(а):
Что автор имел ввиду?

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

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

 Профиль  
                  
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 06:48 


17/05/13
160
ewert в сообщении #878428 писал(а):
Ну не существует метода Гаусса для диагонализации.

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

 Профиль  
                  
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 16:17 
Аватара пользователя


31/10/08
1244
ewert
По моему Вы придираетесь. Одно из определений метода Гауса звучит как применение элементарных преобразований для исключения элементов матрицы. Так что метод диагонализации существует. Более того имеет математический смысл, как часть алгоритма поиска определителя матрицы. Правда не имеет практического смысла.

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

 Профиль  
                  
 
 Re: Работает ли код корректно?
Сообщение23.06.2014, 17:08 
Заслуженный участник


09/09/10
3729

(Оффтоп)

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 
Заслуженный участник


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

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

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

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


17/05/13
160
Pavia в сообщении #878669 писал(а):
hassword
Нет треугольник и диагональ имеет разные определения. Поэтому код точно неверен.

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group