mirror of
https://gitlab.com/sheaf/metabrush.git
synced 2024-12-03 12:24:08 +00:00
Fix some more issues with interval recip
This commit is contained in:
parent
2289468a84
commit
cebfeb0b7a
|
@ -141,6 +141,9 @@ eval f ( t, i, s ) = ( f t `Seq.index` i ) s
|
||||||
mkVal :: Double -> Int -> Double -> ( ℝ 1, Int, ℝ 1 )
|
mkVal :: Double -> Int -> Double -> ( ℝ 1, Int, ℝ 1 )
|
||||||
mkVal t i s = ( ℝ1 t, i, ℝ1 s )
|
mkVal t i s = ( ℝ1 t, i, ℝ1 s )
|
||||||
|
|
||||||
|
mkI :: ( Double, Double ) -> 𝕀 Double
|
||||||
|
mkI ( lo, hi ) = 𝕀 lo hi
|
||||||
|
|
||||||
mkBox :: ( Double, Double ) -> Int -> ( Double, Double ) -> Box
|
mkBox :: ( Double, Double ) -> Int -> ( Double, Double ) -> Box
|
||||||
mkBox ( t_min, t_max ) i ( s_min, s_max ) =
|
mkBox ( t_min, t_max ) i ( s_min, s_max ) =
|
||||||
( 𝕀 ( ℝ1 t_min ) ( ℝ1 t_max ) , i, 𝕀 ( ℝ1 s_min ) ( ℝ1 s_max ) )
|
( 𝕀 ( ℝ1 t_min ) ( ℝ1 t_max ) , i, 𝕀 ( ℝ1 s_min ) ( ℝ1 s_max ) )
|
||||||
|
@ -559,44 +562,34 @@ getR1 (ℝ1 u) = u
|
||||||
|
|
||||||
(f, fI) = brushStrokeFunctions $ ellipseBrushStroke (0,1) pi
|
(f, fI) = brushStrokeFunctions $ ellipseBrushStroke (0,1) pi
|
||||||
nbPotentialSols box = let ( _newtTrees, ( dunno, sols ) ) = intervalNewtonGSFrom NoPreconditioning 1e-7 fI box in length dunno + length sols
|
nbPotentialSols box = let ( _newtTrees, ( dunno, sols ) ) = intervalNewtonGSFrom NoPreconditioning 1e-7 fI box in length dunno + length sols
|
||||||
showTrees box = map ( uncurry showIntervalNewtonTree ) $ fst $ intervalNewtonGSFrom NoPreconditioning 1e-7 fI box
|
showTrees box = putStrLn $ unlines $ map Data.Tree.View.showTree $ map ( uncurry showIntervalNewtonTree ) $ fst $ intervalNewtonGSFrom NoPreconditioning 1e-7 fI box
|
||||||
|
|
||||||
(t, i, s) = mkBox (0.548610200176363, 0.5486102071493623) 2 (0.5480950215354709, 0.5480952)
|
sol_t = 0.5486100729150693796677845183880669025324233347060776339185 :: Double
|
||||||
putStrLn $ unlines $ map Data.Tree.View.showTree $ showTrees (t,i,s)
|
sol_s = 0.5480950141859386853197594577293968665598143630958601978245 :: Double
|
||||||
|
containsSol (t, _i, s) = getR1 (inf t) <= sol_t && getR1 (sup t) >= sol_t && getR1 (inf s) <= sol_s && getR1 (sup s) >= sol_s
|
||||||
|
|
||||||
|
(t, i, s) = mkBox (0.54, 0.55) 2 (0.5480, 0.5481)
|
||||||
|
containsSol (t, i, s)
|
||||||
|
nbPotentialSols (t,i,s)
|
||||||
|
|
||||||
t_mid = 0.5 * ( getR1 ( inf t ) + getR1 ( sup t ) )
|
t_mid = 0.5 * ( getR1 ( inf t ) + getR1 ( sup t ) )
|
||||||
s_mid = 0.5 * ( getR1 ( inf s ) + getR1 ( sup s ) )
|
s_mid = 0.5 * ( getR1 ( inf s ) + getR1 ( sup s ) )
|
||||||
D12 ( T f ) ( T ( T f_t ) ) ( T ( T f_s ) ) = dEdsdcdt $ eval fI (t, i, s)
|
D12 ( T _f ) ( T ( T f_t ) ) ( T ( T f_s ) ) = dEdsdcdt $ eval fI (t, i, s)
|
||||||
|
D0 ( T f_mid ) = dEdsdcdt $ eval f $ mkVal t_mid 2 s_mid
|
||||||
t' = coerce ( (-) @( 𝕀 Double ) ) t ( singleton ( ℝ1 t_mid ) ) :: 𝕀ℝ 1
|
t' = coerce ( (-) @( 𝕀 Double ) ) t ( singleton ( ℝ1 t_mid ) ) :: 𝕀ℝ 1
|
||||||
s' = coerce ( (-) @( 𝕀 Double ) ) s ( singleton ( ℝ1 s_mid ) ) :: 𝕀ℝ 1
|
s' = coerce ( (-) @( 𝕀 Double ) ) s ( singleton ( ℝ1 s_mid ) ) :: 𝕀ℝ 1
|
||||||
a = ( f_t, f_s )
|
a = ( f_t, f_s )
|
||||||
b = negV2 $ singleton $ midV2 f
|
b = negV2 $ singleton f_mid
|
||||||
[((t2', s2'), isContr)] = gaussSeidel a b (t', s')
|
[((t2', s2'), isContr)] = gaussSeidel a b (t', s')
|
||||||
t2 = coerce ( (+) @( 𝕀 Double ) ) t2' ( singleton ( ℝ1 t_mid ) ) :: 𝕀ℝ 1
|
t2 = coerce ( (+) @( 𝕀 Double ) ) t2' ( singleton ( ℝ1 t_mid ) ) :: 𝕀ℝ 1
|
||||||
s2 = coerce ( (+) @( 𝕀 Double ) ) s2' ( singleton ( ℝ1 s_mid ) ) :: 𝕀ℝ 1
|
s2 = coerce ( (+) @( 𝕀 Double ) ) s2' ( singleton ( ℝ1 s_mid ) ) :: 𝕀ℝ 1
|
||||||
|
|
||||||
t2
|
t2
|
||||||
> [ℝ1 0.548610200176363, ℝ1 0.5486102071493624]
|
> [ℝ1 0.5451193766263323, ℝ1 0.545225929860598]
|
||||||
s2
|
s2
|
||||||
> [ℝ1 0.5480950911334656, ℝ1 0.5480952000000001]
|
> [ℝ1 0.548, ℝ1 0.5481]
|
||||||
|
containsSol (t2, i, s2)
|
||||||
mkBox (0.548610200176363, 0.5486102071493624) i (0.5480950911334656, 0.5480952000000001)
|
> False
|
||||||
|
|
||||||
t inf (no change)
|
|
||||||
|
|
||||||
t sup (no change)
|
|
||||||
|
|
||||||
s_inf:
|
|
||||||
0.5480950215354709
|
|
||||||
0.5480950911334656
|
|
||||||
|
|
||||||
s_sup (no change)
|
|
||||||
|
|
||||||
ghci> potentialCusp $ eval fI $ mkBox (0.548610200176363, 0.5486102071493623) 2 (0.54809502, 0.5480952)
|
|
||||||
True
|
|
||||||
ghci> potentialCusp $ eval fI $ mkBox (0.548610200176363, 0.5486102071493623) 2 (0.54809503, 0.5480952)
|
|
||||||
False
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -613,4 +606,5 @@ b2 = 𝕀 b2_lo b2_hi
|
||||||
x1 = 𝕀 x1_lo x1_hi
|
x1 = 𝕀 x1_lo x1_hi
|
||||||
x2 = 𝕀 x2_lo x2_hi
|
x2 = 𝕀 x2_lo x2_hi
|
||||||
|
|
||||||
-}
|
( b1 - a12 * x2 ) `extendedDivide` a11
|
||||||
|
-}
|
||||||
|
|
|
@ -184,6 +184,8 @@ instance HasEnvelopeEquation 2 where
|
||||||
!ee_t = c_tt × c_s + c_t × c_ts
|
!ee_t = c_tt × c_s + c_t × c_ts
|
||||||
!ee_s = c_ts × c_s + c_t × c_ss
|
!ee_s = c_ts × c_s + c_t × c_ss
|
||||||
!𝛿E𝛿sdcdt = ee_s *^ c_t ^-^ ee_t *^ c_s
|
!𝛿E𝛿sdcdt = ee_s *^ c_t ^-^ ee_t *^ c_s
|
||||||
|
-- TODO: we get c_t * c_t and c_s * c_s terms...
|
||||||
|
-- These could be squares (better with interval arithmetic)?
|
||||||
in ( D12 ( co ee ) ( T $ co ee_t ) ( T $ co ee_s )
|
in ( D12 ( co ee ) ( T $ co ee_t ) ( T $ co ee_s )
|
||||||
, D0 𝛿E𝛿sdcdt )
|
, D0 𝛿E𝛿sdcdt )
|
||||||
-- Computation of total derivative dc/dt:
|
-- Computation of total derivative dc/dt:
|
||||||
|
|
|
@ -73,22 +73,21 @@ instance Torsor ( T ( 𝕀 Double ) ) ( 𝕀 Double ) where
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- Extended division
|
-- Extended division
|
||||||
|
|
||||||
extendedDivide :: ( Field d, Field ( 𝕀 d ), Ord d ) => 𝕀 d -> 𝕀 d -> [ 𝕀 d ]
|
extendedDivide :: 𝕀 Double -> 𝕀 Double -> [ 𝕀 Double ]
|
||||||
extendedDivide x y = map ( x * ) ( extendedRecip y )
|
extendedDivide x y = map ( x * ) ( extendedRecip y )
|
||||||
{-# SPECIALISE extendedDivide :: 𝕀 Double -> 𝕀 Double -> [ 𝕀 Double ] #-}
|
|
||||||
|
|
||||||
extendedRecip :: ( Field d, Field ( 𝕀 d ), Ord d ) => 𝕀 d -> [ 𝕀 d ]
|
extendedRecip :: 𝕀 Double -> [ 𝕀 Double ]
|
||||||
extendedRecip x@( 𝕀 lo hi )
|
extendedRecip x@( 𝕀 lo hi )
|
||||||
| lo == fromInteger 0 && hi == fromInteger 0
|
| lo == 0 && hi == 0
|
||||||
= [ 𝕀 negInf posInf ]
|
= [ 𝕀 negInf posInf ]
|
||||||
| lo >= fromInteger 0 || hi <= fromInteger 0
|
| lo >= 0 || hi <= 0
|
||||||
= [ recip x ]
|
= [ recip x ]
|
||||||
| otherwise
|
| otherwise
|
||||||
= [ 𝕀 negInf ( recip lo ), 𝕀 ( recip hi ) posInf ]
|
= [ recip $ 𝕀 lo -0, recip $ 𝕀 0 hi ]
|
||||||
where
|
where
|
||||||
negInf = fromInteger (-1) / fromInteger 0
|
negInf, posInf :: Double
|
||||||
posInf = fromInteger 1 / fromInteger 0
|
negInf = -1 / 0
|
||||||
{-# SPECIALISE extendedRecip :: 𝕀 Double -> [ 𝕀 Double ] #-}
|
posInf = 1 / 0
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- Lattices.
|
-- Lattices.
|
||||||
|
|
|
@ -107,12 +107,12 @@ instance Prelude.Fractional ( 𝕀 Double ) where
|
||||||
fromRational r =
|
fromRational r =
|
||||||
let q = Prelude.fromRational r
|
let q = Prelude.fromRational r
|
||||||
in 𝕀 q q
|
in 𝕀 q q
|
||||||
recip (𝕀 lo hi)
|
recip ( 𝕀 lo hi )
|
||||||
-- #ifdef ASSERTS
|
-- #ifdef ASSERTS
|
||||||
| lo == 0
|
| lo == 0
|
||||||
= 𝕀 ( fst $ divI 1 hi ) ( 1 / 0 )
|
= 𝕀 ( fst $ divI 1 hi ) ( 1 Prelude./ 0 )
|
||||||
| hi == 0
|
| hi == 0
|
||||||
= 𝕀 ( -1 / 0 ) ( snd $ divI 1 lo )
|
= 𝕀 ( -1 Prelude./ 0 ) ( snd $ divI 1 lo )
|
||||||
| lo > 0 || hi < 0
|
| lo > 0 || hi < 0
|
||||||
-- #endif
|
-- #endif
|
||||||
= 𝕀 ( fst $ divI 1 hi ) ( snd $ divI 1 lo )
|
= 𝕀 ( fst $ divI 1 hi ) ( snd $ divI 1 lo )
|
||||||
|
@ -120,7 +120,7 @@ instance Prelude.Fractional ( 𝕀 Double ) where
|
||||||
| otherwise
|
| otherwise
|
||||||
= error "BAD interval recip; should use extendedRecip instead"
|
= error "BAD interval recip; should use extendedRecip instead"
|
||||||
-- #endif
|
-- #endif
|
||||||
p / q = p * recip q
|
p / q = p * Prelude.recip q
|
||||||
|
|
||||||
instance Floating ( 𝕀 Double ) where
|
instance Floating ( 𝕀 Double ) where
|
||||||
sqrt = withHW Prelude.sqrt
|
sqrt = withHW Prelude.sqrt
|
||||||
|
|
|
@ -126,6 +126,7 @@ instance Num a => Ring ( ViaPrelude a ) where
|
||||||
|
|
||||||
instance Fractional a => Field ( ViaPrelude a ) where
|
instance Fractional a => Field ( ViaPrelude a ) where
|
||||||
fromRational = coerce $ Prelude.fromRational @a
|
fromRational = coerce $ Prelude.fromRational @a
|
||||||
|
recip = coerce $ Prelude.recip @a
|
||||||
(/) = coerce $ (Prelude./) @a
|
(/) = coerce $ (Prelude./) @a
|
||||||
|
|
||||||
instance Prelude.Floating a => Floating ( ViaPrelude a ) where
|
instance Prelude.Floating a => Floating ( ViaPrelude a ) where
|
||||||
|
|
Loading…
Reference in a new issue