00001 00002
00003 00004 00005 00006
00007 00008 00009 00010 00011 00012
00013 00014 00015
00016 package require kernel
00017 package require jmath
00018 package require filter
00019
00020
00021 00022 set dt "0.1"
00023
00024 set t 0
00025 set x 0
00026 set v 1
00027
00028 set z [jmath::new_vec 1]
00029
00030 set gamma 1
00031 set r "0.1"
00032
00033 set F [jmath::new_mat 2 2]
00034 jmath::setValue $F "((1, $dt), (0, 1))"
00035
00036 set filter_gamma $gamma
00037 set filter_r $r
00038
00039 set Q [jmath::new_sym_mat 2]
00040 jmath::setValue $Q \
00041 "(([expr $filter_gamma*pow($dt,4)/4], [expr $filter_gamma*pow($dt,3)/2]), \
00042 ([expr $filter_gamma*pow($dt,3)/2], [expr $filter_gamma*pow($dt,2)]))"
00043
00044 set pm [filter::new_LinearPredictModel $F $Q]
00045 $pm setTimeStep $dt
00046
00047 set H [jmath::new_mat 1 2]
00048 jmath::setValue $H "((1, 0))"
00049
00050 set om [filter::new_LinearObserveModel $H]
00051
00052 set R [jmath::new_vec 1]
00053 jmath::setValue $R "($filter_r)"
00054
00055 $om setUncorrelatedR $R
00056
00057 set Lambda_0 [jmath::new_sym_mat 2]
00058 jmath::setValue $Lambda_0 \
00059 "(($filter_r, 0), \
00060 (0,[expr 4*$filter_r/pow($dt,2)]))"
00061
00062 set X_0 [jmath::new_vec 2]
00063 $X_0 clear
00064
00065 set myFilter [filter::new_KalmanFilter 2]
00066 00067 00068 $myFilter setCovUpdateType $::filter::BaseKalmanFilter_JOSEPH
00069 $myFilter init $X_0 $Lambda_0
00070
00071 jmath::NormalDistribution myNormale 0 $r
00072
00073 set myLog [kernel::new_DataLogger "demoKalman.dat"]
00074 $myLog addLoggable $myFilter
00075
00076 $myLog log
00077
00078 proc oneStep {} {
00079 global t dt x v z pm om myNormale myFilter myLog
00080
00081 set x [expr "$x + $dt*$v"]
00082 set w [myNormale get]
00083
00084 $z set 0 [expr "$x+$w"]
00085
00086 $myFilter predict $pm
00087 $myFilter update $om $z
00088
00089 $myLog log
00090
00091 }00092
00093 proc step {{nSteps 50}} {
00094 00095 for {set i 0} {$i < $nSteps} {incr i} {
00096 oneStep
00097 }
00098 }