2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
|
|
@ -2,21 +2,17 @@ import Data.Array.IArray
|
|||
import Data.List
|
||||
import Cholesky
|
||||
|
||||
takeDrop 0 xs = ([],xs)
|
||||
takeDrop _ [] = ([],[])
|
||||
takeDrop n (x:xs) = (x:a,b) where (a,b) = takeDrop (n-1) xs
|
||||
|
||||
fm _ [] = ""
|
||||
fm _ [x] = fst x
|
||||
fm width ((a,b):xs) = a ++ (take (width - b) $ cycle " ") ++ (fm width xs)
|
||||
|
||||
fmt width row (xs,[]) = fm width xs
|
||||
fmt width row (xs,ys) = fm width xs ++ "\n" ++ fmt width row (takeDrop row ys)
|
||||
fmt width row (xs,ys) = fm width xs ++ "\n" ++ fmt width row (splitAt row ys)
|
||||
|
||||
showMatrice row xs = ys where
|
||||
vs = map (\s -> let sh = show s in (sh,length sh)) xs
|
||||
width = (maximum $ snd $ unzip vs) + 2
|
||||
ys = fmt width row (takeDrop row vs)
|
||||
width = (maximum $ snd $ unzip vs) + 1
|
||||
ys = fmt width row (splitAt row vs)
|
||||
|
||||
ex1, ex2 :: Arr
|
||||
ex1 = listArray ((0,0),(2,2)) [25, 15, -5,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
cholesky(M) =
|
||||
{
|
||||
my (L = matrix(#M,#M));
|
||||
|
||||
for (i = 1, #M,
|
||||
for (j = 1, i,
|
||||
s = sum (k = 1, j-1, L[i,k] * L[j,k]);
|
||||
L[i,j] = if (i == j, sqrt(M[i,i] - s), (M[i,j] - s) / L[j,j])
|
||||
)
|
||||
);
|
||||
L
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
function cholesky ($a) {
|
||||
$l = @()
|
||||
if ($a) {
|
||||
$n = $a.count
|
||||
$end = $n - 1
|
||||
$l = @(0) * $n
|
||||
foreach ($i in 0..$end) {$l[$i] = @(0) * $n}
|
||||
foreach ($k in 0..$end) {
|
||||
$m = $k - 1
|
||||
$sum = 0
|
||||
if(0 -lt $k) {
|
||||
foreach ($j in 0..$m) {$sum += $l[$k][$j]*$l[$k][$j]}
|
||||
}
|
||||
$l[$k][$k] = [Math]::Sqrt($a[$k][$k] - $sum)
|
||||
if ($k -lt $end) {
|
||||
foreach ($i in ($k+1)..$end) {
|
||||
$sum = 0
|
||||
if (0 -lt $k) {
|
||||
foreach ($j in 0..$m) {$sum += $l[$i][$j]*$l[$k][$j]}
|
||||
}
|
||||
$l[$i][$k] = ($a[$i][$k] - $sum)/$l[$k][$k]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$l
|
||||
}
|
||||
|
||||
function show($a) {
|
||||
if($a) {
|
||||
0..($a.Count - 1) | foreach{ if($a[$_]){"$($a[$_])"}else{""} }
|
||||
}
|
||||
}
|
||||
|
||||
$a1 = @(
|
||||
@(25, 15, -5),
|
||||
@(15, 18, 0),
|
||||
@(-5, 0, 11)
|
||||
)
|
||||
"a1 ="
|
||||
show $a1
|
||||
""
|
||||
"l1 ="
|
||||
show (cholesky $a1)
|
||||
""
|
||||
$a2 = @(
|
||||
@(18, 22, 54, 42),
|
||||
@(22, 70, 86, 62),
|
||||
@(54, 86, 174, 134),
|
||||
@(42, 62, 134, 106)
|
||||
)
|
||||
"a2 ="
|
||||
show $a2
|
||||
""
|
||||
"l2 ="
|
||||
show (cholesky $a2)
|
||||
|
|
@ -10,7 +10,7 @@ hexer = 18 22 54 42, /*define a 4x4 matrix. */
|
|||
call Cholesky hexer
|
||||
exit /*stick a fork in it, we're all done. */
|
||||
/*────────────────────────────────────────────────────────────────────────────*/
|
||||
Cholesky: procedure; parse arg mat; say; say; call tell 'input array',mat
|
||||
Cholesky: procedure; parse arg mat; say; say; call tell 'input matrix',mat
|
||||
do r=1 for ord
|
||||
do c=1 for r; $=0; do i=1 for c-1; $=$+!.r.i*!.c.i; end /*i*/
|
||||
if r=c then !.r.r=sqrt(!.r.r-$)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
10 LET d=2000: GO SUB 1000: GO SUB 4000: GO SUB 5000
|
||||
20 LET d=3000: GO SUB 1000: GO SUB 4000: GO SUB 5000
|
||||
30 STOP
|
||||
1000 RESTORE d
|
||||
1010 READ a,b
|
||||
1020 DIM m(a,b)
|
||||
1040 FOR i=1 TO a
|
||||
1050 FOR j=1 TO b
|
||||
1060 READ m(i,j)
|
||||
1070 NEXT j
|
||||
1080 NEXT i
|
||||
1090 RETURN
|
||||
2000 DATA 3,3,25,15,-5,15,18,0,-5,0,11
|
||||
3000 DATA 4,4,18,22,54,42,22,70,86,62,54,86,174,134,42,62,134,106
|
||||
4000 REM Cholesky decomposition
|
||||
4005 DIM l(a,b)
|
||||
4010 FOR i=1 TO a
|
||||
4020 FOR j=1 TO i
|
||||
4030 LET s=0
|
||||
4050 FOR k=1 TO j-1
|
||||
4060 LET s=s+l(i,k)*l(j,k)
|
||||
4070 NEXT k
|
||||
4080 IF i=j THEN LET l(i,j)=SQR (m(i,i)-s): GO TO 4100
|
||||
4090 LET l(i,j)=(m(i,j)-s)/l(j,j)
|
||||
4100 NEXT j
|
||||
4110 NEXT i
|
||||
4120 RETURN
|
||||
5000 REM Print
|
||||
5010 FOR r=1 TO a
|
||||
5020 FOR c=1 TO b
|
||||
5030 PRINT l(r,c);" ";
|
||||
5040 NEXT c
|
||||
5050 PRINT
|
||||
5060 NEXT r
|
||||
5070 RETURN
|
||||
Loading…
Add table
Add a link
Reference in a new issue