0votos

Eliminación Gaussiana solo en lenguaje C en Haskell

por josejuan hace 5 años

En Haskell.

Eliminación o reducción Gaussiana en programación solo con lenhuaje C, presentado en consola.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
-- Gauss-Jordan, vamos moviendo filas del grupo reducido al no reducido hasta terminar 
gauss :: (Ord a, Fractional a) => [[a]] -> [[a]] 
gauss = reduce [] 
    where reduce rs [] = rs 
          reduce rs xs = reduce (x: map (adjust p x) rs) (map (adjust p x) xs') 
                         where (x':xs') = sortBy (using nonZeroAt) xs 
                               (x, p) = (normalize x', nonZeroAt x') 
                               adjust i zs ys = zipWith (\y z -> y - w * z) ys zs where w = ys!!i 
           
 
 
 
 
 
 
 
-- Posición del primer no cero 
nonZeroAt :: (Eq a, Num a) => [a] -> Int 
nonZeroAt = length . takeWhile (==0) 
 
-- El primer factor no nulo será 1 
normalize :: (Eq b, Fractional b) => [b] -> [b] 
normalize xs = map (/x) xs where x = xs!!(nonZeroAt xs) 
 
-- Devuelve una función comparadora bajo la actuación de otra función 
using :: Ord a => (t -> a) -> t -> t -> Ordering 
using f = \x y -> compare (f x) (f y) 
 
 
 
 
-- Ejemplo ------------------------ 
m :: [[Double]] 
m = [[1, 2,  3] 
    ,[1, 1, -2] 
     
*Main> gauss m 
    [[ 0, 1,  5] 
    ,[ 1, 0, -7] 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.