Library R_n
R^n
Require Export Differential.
Require Export Fourier.
Require Export Reals_compl.
Require ZArith.
Open Local Scope R_scope.
Section Rn.
Variable xmin xmax:R.
Hypothesis xminLtxmax: xmin < xmax.
Definition ni (dx:R): Z :=
((jx (xmax-xmin) dx))%Z.
Lemma ni_pos:
forall dx, 0 < dx -> (0 <= ni dx)%Z.
Lemma ni_Zabs_nat: forall dx, 0 < dx ->
Z_of_nat (Zabs_nat (ni dx)) = ni dx.
R^n is a vector space.
Vectors in R^n are represented by nat -> R functions
Definition add_n (f g : Z -> R) : Z -> R :=
fun i => f i + g i.
Definition subtract_n (f g : Z -> R) : Z -> R :=
fun i => f i - g i.
Definition scalar_multiply_n (l : R) (f : Z -> R) : Z -> R :=
fun i => l * f i.
Notation "f + g" := (add_n f g) : type_scope.
Notation "f - g" := (subtract_n f g) : type_scope.
Definition of the dot_product from 0 to n:nat where we add from 0 to n-1
Fixpoint dot_product_n (n:nat) (f g : Z -> R) {struct n} : R :=
match n with
| 0 => 0
| S n' => (f (Z_of_nat n')) * (g (Z_of_nat n')) + dot_product_n n' f g
end.
Definition squared_norm_n (n:nat) (f : Z -> R) := dot_product_n n f f.
Many lemmas
Lemma dot_product_n_zero :
forall u v n,
(forall i : Z,
(0 <= i < Z_of_nat n)%Z -> u i = 0 \/ v i = 0) ->
dot_product_n n u v = 0.
Lemma dot_product_n_distr_l :
forall (n : nat) (f g h : Z -> R),
dot_product_n n f g + dot_product_n n h g =
dot_product_n n (add_n f h) g.
Lemma dot_product_n_distr_r :
forall (n : nat) (f g h : Z -> R),
dot_product_n n f g + dot_product_n n f h =
dot_product_n n f (add_n g h).
Lemma dot_product_n_sub_distr_l :
forall (n : nat) (f g h : Z -> R),
dot_product_n n f g - dot_product_n n h g =
dot_product_n n (subtract_n f h) g.
Lemma dot_product_n_sub_distr_r :
forall (n : nat) (f g h : Z -> R),
dot_product_n n f g - dot_product_n n f h =
dot_product_n n f (subtract_n g h).
Lemma dot_product_n_scal_mult_l :
forall (n : nat) (l : R) (f g : Z -> R),
dot_product_n n (scalar_multiply_n l f) g =
l * dot_product_n n f g.
Lemma dot_product_n_scal_mult_r :
forall (n : nat) (l : R) (f g : Z -> R),
dot_product_n n f (scalar_multiply_n l g) =
l * dot_product_n n f g.
Lemma dot_product_n_sym :
forall (n : nat) (f g : Z -> R),
dot_product_n n f g = dot_product_n n g f.
Lemma dot_product_n_eq_suf_l :
forall (n : nat) (f g h: Z -> R),
(forall i, (0 <= i < Z_of_nat n)%Z -> f i = g i) ->
dot_product_n n f h = dot_product_n n g h.
Lemma dot_product_n_eq_suf_r :
forall (n : nat) (f g h: Z -> R),
(forall i : Z, (0 <= i < Z_of_nat n)%Z -> f i = g i) ->
dot_product_n n h f = dot_product_n n h g.
Lemma dot_product_n_eq_suf_strict_l :
forall (n : nat) (f g h: Z -> R),
(forall i, (0 < i < Z_of_nat n)%Z -> f i = g i) ->
h 0%Z = 0 ->
dot_product_n n f h = dot_product_n n g h.
Lemma dot_product_n_eq_suf_strict_r :
forall (n : nat) (f g h: Z -> R),
(forall i : Z, (0 < i < Z_of_nat n)%Z -> f i = g i) ->
h 0%Z = 0 ->
dot_product_n n h f = dot_product_n n h g.
Lemma dot_product_n_shift_indices: forall (n:nat) (f1 f2 : Z -> R),
dot_product_n n f1 f2 =
dot_product_n n (fun j => f1 (j+1)%Z) (fun j => f2 (j+1)%Z)
+ f1 0%Z*f2 0%Z - f1 (Z_of_nat n) * f2 (Z_of_nat n).
Lemma squared_norm_n_pos_aux:
forall (n:nat) (f: Z -> R),
0 <= (dot_product_n n f f).
Lemma squared_norm_n_pos:
forall n (f: Z -> R),
(0 <= squared_norm_n n f).
Lemma squared_norm_n_scal_mult_n: forall n (r:R) (f:Z -> R),
(squared_norm_n n (scalar_multiply_n r f)) = r*r*(squared_norm_n n f).
Lemma squared_norm_n_plus: forall n (f g:Z->R),
(squared_norm_n n (f+g)%type = squared_norm_n n f + squared_norm_n n g
+ 2 * dot_product_n n f g)%R.
Lemma squared_norm_n_majoration: forall n f M,
(forall j, (0 <= j < Z_of_nat n)%Z -> Rsqr (f j) <= M) ->
dot_product_n n f f <= INR n * M.
Lemma Cauchy_Schwarz: forall n f1 f2,
Rabs (dot_product_n n f1 f2)
<= sqrt (squared_norm_n n f1) * sqrt (squared_norm_n n f2).
Definition finite_dot_product_dx dx u v := dx*dot_product_n (Zabs_nat (ni dx)) u v.
Definition finite_squared_norm_dx dx u := finite_dot_product_dx dx u u.
Definition finite_norm_dx dx u := sqrt (finite_squared_norm_dx dx u).
Lemmas about the finite dot product
Lemma finite_dot_product_dx_zero1:
forall dx f g, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> f i = 0) ->
finite_dot_product_dx dx f g = 0.
Lemma finite_dot_product_dx_zero1ou2:
forall dx f g, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> f i = 0 \/ g i =0) ->
finite_dot_product_dx dx f g = 0.
Lemma finite_squared_norm_dx_pos: forall dx f,
(0 <= dx) ->
0 <= finite_squared_norm_dx dx f.
Lemma finite_squared_norm_dx_eq: forall dx f1 f2, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> f1 i = f2 i) ->
finite_squared_norm_dx dx f1 = finite_squared_norm_dx dx f2.
Lemma finite_squared_norm_dx_zero: forall dx f, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> f i = 0) ->
finite_squared_norm_dx dx f = 0.
Lemma finite_squared_norm_dx_homogen: forall dx l f,
finite_squared_norm_dx dx (scalar_multiply_n l f) =
l * l * finite_squared_norm_dx dx f.
Lemma finite_Cauchy_Schwarz_dx: forall dx f1 f2,
0 <= dx ->
Rabs (finite_dot_product_dx dx f1 f2)
<= finite_norm_dx dx f1 * finite_norm_dx dx f2.
Lemma finite_squared_norm_dx_triang: forall dx f1 f2,
0 <= dx ->
finite_norm_dx dx (fun j => f1 j + f2 j) <=
finite_norm_dx dx f1 + finite_norm_dx dx f2.
Lemma finite_squared_norm_dx_majoration: forall dx f M,
0 < dx -> 0 <= M ->
(forall j : Z, (0 <= j < ni dx )%Z -> Rsqr (f j) <= M) ->
finite_squared_norm_dx dx f <= (xmax-xmin) * M.
Lemma finite_dot_product_dx_sym: forall dx u v,
finite_dot_product_dx dx u v = finite_dot_product_dx dx v u.
Lemma finite_dot_product_dx_eq_l: forall dx u v w, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> u i = v i) ->
finite_dot_product_dx dx u w = finite_dot_product_dx dx v w.
Lemma finite_dot_product_dx_eq_r: forall dx u v w, 0 < dx ->
(forall i, (0 <= i < ni dx)%Z -> u i = v i) ->
finite_dot_product_dx dx w u = finite_dot_product_dx dx w v.
Lemma finite_dot_product_dx_eq_strict_l: forall dx u v w, 0 < dx ->
(forall i, (0 < i < ni dx)%Z -> u i = v i) ->
w 0%Z = 0 ->
finite_dot_product_dx dx u w = finite_dot_product_dx dx v w.
Lemma finite_dot_product_dx_eq_strict_r: forall dx u v w, 0 < dx ->
(forall i, (0 < i < ni dx)%Z -> u i = v i) ->
w 0%Z = 0 ->
finite_dot_product_dx dx w u = finite_dot_product_dx dx w v.
Lemma finite_dot_product_dx_add_l: forall dx u v w,
finite_dot_product_dx dx (add_n u v) w=
finite_dot_product_dx dx u w + finite_dot_product_dx dx v w.
Lemma finite_dot_product_dx_add_r: forall dx u v w,
finite_dot_product_dx dx w (add_n u v) =
finite_dot_product_dx dx w u + finite_dot_product_dx dx w v.
Lemma finite_dot_product_dx_sub_l: forall dx u v w,
finite_dot_product_dx dx (subtract_n u v) w =
finite_dot_product_dx dx u w - finite_dot_product_dx dx v w.
Lemma finite_dot_product_dx_sub_r: forall dx u v w,
finite_dot_product_dx dx w (subtract_n u v) =
finite_dot_product_dx dx w u - finite_dot_product_dx dx w v.
Lemma finite_dot_product_dx_scal_mult_l :
forall dx u v l,
finite_dot_product_dx dx (scalar_multiply_n l u) v =
l * finite_dot_product_dx dx u v.
Lemma finite_dot_product_dx_scal_mult_r :
forall dx u v l,
finite_dot_product_dx dx u (scalar_multiply_n l v) =
l * finite_dot_product_dx dx u v.
Lemma finite_dot_product_dx_shift_indices: forall dx (f1 f2 : Z -> R),
0 < dx ->
f1 0%Z = 0 \/ f2 0%Z = 0 ->
f1 (ni dx) = 0 \/ f2 (ni dx) = 0 ->
finite_dot_product_dx dx f1 f2 =
finite_dot_product_dx dx (fun j => f1 (j+1)%Z) (fun j => f2 (j+1)%Z).
Lemma semi_finite_dot_product_dx: forall dx Ah u v,
(forall u v, 0 < dx -> u 0%Z = 0 -> u (ni dx) = 0 -> v 0%Z = 0 -> v (ni dx) = 0 ->
finite_dot_product_dx dx (Ah u) v
= finite_dot_product_dx dx u (Ah v)) ->
0 < dx -> u 0%Z = 0 -> u (ni dx) = 0 -> v 0%Z = 0 -> v (ni dx) = 0 ->
finite_dot_product_dx dx (Ah u) v =
/4 * finite_dot_product_dx dx (Ah (add_n u v)) (add_n u v)
- /4 * finite_dot_product_dx dx (Ah (subtract_n u v)) (subtract_n u v).
Lemma finite_squared_norm_parall: forall dx x y,
finite_squared_norm_dx dx (x+y)%type +
finite_squared_norm_dx dx (x-y)%type =
2*(finite_squared_norm_dx dx x + finite_squared_norm_dx dx y).
Lemma finite_squared_norm_parall_add: forall dx x y,
0 <= dx ->
finite_squared_norm_dx dx (x+y)%type <=
2*(finite_squared_norm_dx dx x + finite_squared_norm_dx dx y).
Lemma finite_squared_norm_parall_sub: forall dx x y,
0 <= dx ->
finite_squared_norm_dx dx (x-y)%type <=
2*(finite_squared_norm_dx dx x + finite_squared_norm_dx dx y).
Lemma dot_product_n_le: forall n uh vh r1 r2,
(forall i, (0 <= i < Z_of_nat n)%Z -> Rabs (uh i) <= r1) ->
(forall i, (0 <= i < Z_of_nat n)%Z -> Rabs (vh i) <= r2) ->
Rabs (dot_product_n n uh vh) <= INR n*r1*r2.
Lemma dot_product_n_le2: forall n uh vh r1 r2,
0 <= r1 -> 0 <= r2 ->
(forall i, (0 <= i < Z_of_nat n)%Z -> Rabs (uh i) <= r1 \/ vh i=0) ->
(forall i, (0 <= i < Z_of_nat n)%Z -> Rabs (vh i) <= r2 \/ uh i=0) ->
Rabs (dot_product_n n uh vh) <= INR n*r1*r2.
Lemma finite_dot_product_le: forall dx uh vh r1 r2, 0 < dx ->
((0 < ni dx)%Z \/ (0 <= r1 /\ 0 <= r2)) ->
(forall i, (0 <= i < ni dx )%Z -> Rabs (uh i) <= r1) ->
(forall i, (0 <= i < ni dx )%Z -> Rabs (vh i) <= r2) ->
Rabs (finite_dot_product_dx dx uh vh) <= (xmax-xmin)*r1*r2.
Lemma finite_dot_product_le2: forall dx uh vh r1 r2, 0 < dx ->
0 <= r1 -> 0 <= r2 ->
(forall i, (0 <= i < ni dx )%Z -> Rabs (uh i) <= r1 \/ vh i=0) ->
(forall i, (0 <= i < ni dx )%Z -> Rabs (vh i) <= r2 \/ uh i=0) ->
Rabs (finite_dot_product_dx dx uh vh) <= (xmax-xmin)*r1*r2.
Lemma finite_norm_le: forall dx uh r, 0 < dx -> ((0 < ni dx)%Z \/ (0 <= r)) ->
(forall i, (0 <= i < ni dx )%Z -> Rabs (uh i) <= r) ->
finite_norm_dx dx uh <= sqrt (xmax -xmin)*r.
Lemma dot_product_n_le_reverse: forall n uh i, (0 <= i < Z_of_nat n)%Z ->
Rsqr (uh i) <= dot_product_n n uh uh.
Lemma finite_norm_le_reverse: forall dx uh r, 0 < dx ->
finite_norm_dx dx uh <= r -> forall i, (0 <= i < ni dx)%Z -> Rabs (uh i) <= r / sqrt (dx).
End Rn.