1 (* chapter 'Biegelinie' from the textbook:
2 Timischl, Kaiser. Ingenieur-Mathematik 3. Wien 1999. p.268-271.
3 author: Walther Neuper 050826,
4 (c) due to copyright terms
7 theory Biegelinie imports Integrate Equation EqSystem Base_Tools begin
11 qq :: "real => real" (* Streckenlast *)
12 Q :: "real => real" (* Querkraft *)
13 Q' :: "real => real" (* Ableitung der Querkraft *)
14 M'_b :: "real => real" ("M'_b") (* Biegemoment *)
15 M'_b' :: "real => real" ("M'_b'") (* Ableitung des Biegemoments *)
16 y'' :: "real => real" (* 2.Ableitung der Biegeline *)
17 y' :: "real => real" (* Neigung der Biegeline *)
18 (*y :: "real => real" (* Biegeline *)*)
19 EI :: "real" (* Biegesteifigkeit *)
21 (*new Descriptions in the related problems*)
22 Traegerlaenge :: "real => una"
23 Streckenlast :: "real => una"
24 BiegemomentVerlauf :: "bool => una"
25 Biegelinie :: "(real => real) => una"
26 AbleitungBiegelinie :: "(real => real) => una"
27 Randbedingungen :: "bool list => una"
28 RandbedingungenBiegung :: "bool list => una"
29 RandbedingungenNeigung :: "bool list => una"
30 RandbedingungenMoment :: "bool list => una"
31 RandbedingungenQuerkraft :: "bool list => una"
32 FunktionsVariable :: "real => una"
33 Funktionen :: "bool list => una"
34 Gleichungen :: "bool list => una"
35 GleichungsVariablen :: "real list => una"
39 Querkraft_Belastung: "Q' x = -qq x" and
40 Belastung_Querkraft: "-qq x = Q' x" and
42 Moment_Querkraft: "M_b' x = Q x" and
43 Querkraft_Moment: "Q x = M_b' x" and
45 Neigung_Moment: "y'' x = -M_b x/ EI" and
46 Moment_Neigung: "M_b x = -EI * y'' x" and
48 (*according to rls 'simplify_Integral': .. = 1/a * .. instead .. = ../ a*)
49 make_fun_explicit: "Not (a =!= 0) ==> (a * (f x) = b) = (f x = 1/a * b)"
52 KEStore_Elems.add_thes
54 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
55 make_isa @{theory} ("IsacKnowledge", "Theorems")
56 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
57 make_thm @{theory} "IsacKnowledge" ("Belastung_Querkraft", @{thm Belastung_Querkraft})
58 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
59 make_thm @{theory} "IsacKnowledge" ("Moment_Neigung", @{thm Moment_Neigung})
60 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
61 make_thm @{theory} "IsacKnowledge" ("Moment_Querkraft", @{thm Moment_Querkraft})
62 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
63 make_thm @{theory} "IsacKnowledge" ("Neigung_Moment", @{thm Neigung_Moment})
64 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
65 make_thm @{theory} "IsacKnowledge" ("Querkraft_Belastung", @{thm Querkraft_Belastung})
66 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
67 make_thm @{theory} "IsacKnowledge" ("Querkraft_Moment", @{thm Querkraft_Moment})
68 ["Walther Neuper 2005 supported by a grant from NMI Austria"],
69 make_thm @{theory} "IsacKnowledge" ("make_fun_explicit", @{thm make_fun_explicit})
70 ["Walther Neuper 2005 supported by a grant from NMI Austria"]]
74 setup \<open>KEStore_Elems.add_pbts
75 [(Specify.prep_pbt @{theory} "pbl_bieg" [] Celem.e_pblID
77 [("#Given" ,["Traegerlaenge l_l", "Streckenlast q_q"]),
78 (*("#Where",["0 < l_l"]), ...wait for < and handling Arbfix*)
79 ("#Find" ,["Biegelinie b_b"]),
80 ("#Relate",["Randbedingungen r_b"])],
81 Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["IntegrierenUndKonstanteBestimmen2"]])),
82 (Specify.prep_pbt @{theory} "pbl_bieg_mom" [] Celem.e_pblID
83 (["MomentBestimmte","Biegelinien"],
84 [("#Given" ,["Traegerlaenge l_l", "Streckenlast q_q"]),
85 (*("#Where",["0 < l_l"]), ...wait for < and handling Arbfix*)
86 ("#Find" ,["Biegelinie b_b"]),
87 ("#Relate",["RandbedingungenBiegung r_b","RandbedingungenMoment r_m"])
89 Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["IntegrierenUndKonstanteBestimmen"]])),
90 (Specify.prep_pbt @{theory} "pbl_bieg_momg" [] Celem.e_pblID
91 (["MomentGegebene","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
92 [["IntegrierenUndKonstanteBestimmen","2xIntegrieren"]])),
93 (Specify.prep_pbt @{theory} "pbl_bieg_einf" [] Celem.e_pblID
94 (["einfache","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
95 [["IntegrierenUndKonstanteBestimmen","4x4System"]])),
96 (Specify.prep_pbt @{theory} "pbl_bieg_momquer" [] Celem.e_pblID
97 (["QuerkraftUndMomentBestimmte","Biegelinien"], [], Rule_Set.append_rules "empty" Rule_Set.empty [], NONE,
98 [["IntegrierenUndKonstanteBestimmen","1xIntegrieren"]])),
99 (Specify.prep_pbt @{theory} "pbl_bieg_vonq" [] Celem.e_pblID
100 (["vonBelastungZu","Biegelinien"],
101 [("#Given" ,["Streckenlast q_q","FunktionsVariable v_v"]),
102 ("#Find" ,["Funktionen funs'''"])],
103 Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Biegelinien","ausBelastung"]])),
104 (Specify.prep_pbt @{theory} "pbl_bieg_randbed" [] Celem.e_pblID
105 (["setzeRandbedingungen","Biegelinien"],
106 [("#Given" ,["Funktionen fun_s","Randbedingungen r_b"]),
107 ("#Find" ,["Gleichungen equs'''"])],
108 Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Biegelinien","setzeRandbedingungenEin"]])),
109 (Specify.prep_pbt @{theory} "pbl_equ_fromfun" [] Celem.e_pblID
110 (["makeFunctionTo","equation"],
111 [("#Given" ,["functionEq fu_n","substitution su_b"]),
112 ("#Find" ,["equality equ'''"])],
113 Rule_Set.append_rules "empty" Rule_Set.empty [], NONE, [["Equation","fromFunction"]]))]\<close>
117 val srls = Rule_Def.Repeat {id="srls_IntegrierenUnd..",
119 rew_ord = ("termlessI",termlessI),
120 erls = Rule_Set.append_rules "erls_in_srls_IntegrierenUnd.." Rule_Set.empty
121 [(*for asm in NTH_CONS ...*)
122 Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
123 (*2nd NTH_CONS pushes n+-1 into asms*)
124 Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_")
126 srls = Rule_Set.Empty, calc = [], errpatts = [],
127 rules = [Rule.Thm ("NTH_CONS",ThmC.numerals_to_Free @{thm NTH_CONS}),
128 Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_"),
129 Rule.Thm ("NTH_NIL",ThmC.numerals_to_Free @{thm NTH_NIL}),
130 Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs"eval_lhs_"),
131 Rule.Eval("Prog_Expr.rhs", Prog_Expr.eval_rhs"eval_rhs_"),
132 Rule.Eval("Prog_Expr.argument'_in", Prog_Expr.eval_argument_in "Prog_Expr.argument'_in")
134 scr = Rule.Empty_Prog};
137 Rule_Def.Repeat {id="srls_IntegrierenUnd..",
139 rew_ord = ("termlessI",termlessI),
140 erls = Rule_Set.append_rules "erls_in_srls_IntegrierenUnd.." Rule_Set.empty
141 [(*for asm in NTH_CONS ...*)
142 Rule.Eval ("Orderings.ord_class.less", Prog_Expr.eval_equ "#less_"),
143 (*2nd NTH_CONS pushes n+-1 into asms*)
144 Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_")
146 srls = Rule_Set.Empty, calc = [], errpatts = [],
147 rules = [Rule.Thm ("NTH_CONS",ThmC.numerals_to_Free @{thm NTH_CONS}),
148 Rule.Eval("Groups.plus_class.plus", (**)eval_binop "#add_"),
149 Rule.Thm ("NTH_NIL", ThmC.numerals_to_Free @{thm NTH_NIL}),
150 Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs "eval_lhs_"),
151 Rule.Eval("Prog_Expr.filter'_sameFunId", Prog_Expr.eval_filter_sameFunId "Prog_Expr.filter'_sameFunId"),
152 (*WN070514 just for smltest/../biegelinie.sml ...*)
153 Rule.Eval("Prog_Expr.sameFunId", Prog_Expr.eval_sameFunId "Prog_Expr.sameFunId"),
154 Rule.Thm ("filter_Cons", ThmC.numerals_to_Free @{thm filter_Cons}),
155 Rule.Thm ("filter_Nil", ThmC.numerals_to_Free @{thm filter_Nil}),
156 Rule.Thm ("if_True", ThmC.numerals_to_Free @{thm if_True}),
157 Rule.Thm ("if_False", ThmC.numerals_to_Free @{thm if_False}),
158 Rule.Thm ("hd_thm", ThmC.numerals_to_Free @{thm hd_thm})
160 scr = Rule.Empty_Prog};
163 section \<open>Methods\<close>
164 (* setup parent directory *)
165 setup \<open>KEStore_Elems.add_mets
166 [Specify.prep_met @{theory} "met_biege" [] Celem.e_metID
167 (["IntegrierenUndKonstanteBestimmen"], [],
168 {rew_ord'="tless_true", rls'= Rule_Set.Empty, calc = [], srls = Rule_Set.Empty, prls = Rule_Set.Empty, crls =Rule_Set.Empty,
169 errpats = [], nrls = Rule_Set.Empty},
172 subsection \<open>Sub-problem "integrate and determine constants", nicely modularised\<close>
174 partial_function (tailrec) biegelinie ::
175 "real \<Rightarrow> real \<Rightarrow> real \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool list \<Rightarrow> real list \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool"
177 "biegelinie l q v b s vs id_abl = (
179 funs = SubProblem (''Biegelinie'', [''vonBelastungZu'', ''Biegelinien''],
180 [''Biegelinien'', ''ausBelastung'']) [REAL q, REAL v, REAL_REAL b, REAL_REAL id_abl];
181 equs = SubProblem (''Biegelinie'', [''setzeRandbedingungen'', ''Biegelinien''],
182 [''Biegelinien'', ''setzeRandbedingungenEin'']) [BOOL_LIST funs, BOOL_LIST s];
183 cons = SubProblem (''Biegelinie'', [''LINEAR'', ''system''],
184 [''no_met'']) [BOOL_LIST equs, REAL_LIST vs];
185 B = Take (lastI funs);
186 B = ((Substitute cons) #> (Rewrite_Set_Inst [(''bdv'', v)] ''make_ratpoly_in'')) B
188 setup \<open>KEStore_Elems.add_mets
189 [Specify.prep_met @{theory} "met_biege_2" [] Celem.e_metID
190 (["IntegrierenUndKonstanteBestimmen2"],
191 [("#Given" ,["Traegerlaenge l", "Streckenlast q",
192 "FunktionsVariable v", "GleichungsVariablen vs", "AbleitungBiegelinie id_abl"]),
193 (*("#Where",["0 < l"]), ...wait for < and handling Arbfix*)
194 ("#Find" ,["Biegelinie b"]),
195 ("#Relate",["Randbedingungen s"])],
196 {rew_ord'="tless_true",
197 rls' = Rule_Set.append_rules "erls_IntegrierenUndK.." Rule_Set.empty
198 [Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
199 Rule.Thm ("not_true",ThmC.numerals_to_Free @{thm not_true}),
200 Rule.Thm ("not_false",ThmC.numerals_to_Free @{thm not_false})],
202 srls = Rule_Set.append_rules "erls_IntegrierenUndK.." Rule_Set.empty
203 [Rule.Eval("Prog_Expr.rhs", Prog_Expr.eval_rhs"eval_rhs_"),
204 Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
205 Rule.Thm ("last_thmI",ThmC.numerals_to_Free @{thm last_thmI}),
206 Rule.Thm ("if_True",ThmC.numerals_to_Free @{thm if_True}),
207 Rule.Thm ("if_False",ThmC.numerals_to_Free @{thm if_False})],
208 prls = Rule_Set.Empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.Empty},
209 @{thm biegelinie.simps})]
211 setup \<open>KEStore_Elems.add_mets
212 [Specify.prep_met @{theory} "met_biege_intconst_2" [] Celem.e_metID
213 (["IntegrierenUndKonstanteBestimmen","2xIntegrieren"], [],
214 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
215 errpats = [], nrls = Rule_Set.empty},
217 Specify.prep_met @{theory} "met_biege_intconst_4" [] Celem.e_metID
218 (["IntegrierenUndKonstanteBestimmen","4x4System"], [],
219 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
220 errpats = [], nrls = Rule_Set.empty},
222 Specify.prep_met @{theory} "met_biege_intconst_1" [] Celem.e_metID
223 (["IntegrierenUndKonstanteBestimmen","1xIntegrieren"], [],
224 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
225 errpats = [], nrls = Rule_Set.empty},
227 Specify.prep_met @{theory} "met_biege2" [] Celem.e_metID
228 (["Biegelinien"], [],
229 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = Rule_Set.empty, prls=Rule_Set.empty, crls = Atools_erls,
230 errpats = [], nrls = Rule_Set.empty},
233 subsection \<open>Compute the general bending line\<close>
235 partial_function (tailrec) belastung_zu_biegelinie :: "real \<Rightarrow> real \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> (real \<Rightarrow> real) \<Rightarrow> bool list"
237 "belastung_zu_biegelinie q__q v_v id_fun id_abl = (
239 q___q = Take (qq v_v = q__q);
241 (Rewrite ''sym_neg_equal_iff_equal'') #>
242 (Rewrite ''Belastung_Querkraft'')) q___q;
243 Q__Q = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
244 [''diff'', ''integration'', ''named'']) [REAL (rhs q___q), REAL v_v, REAL_REAL Q];
245 M__M = Rewrite ''Querkraft_Moment'' Q__Q;
246 M__M = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
247 [''diff'', ''integration'', ''named'']) [REAL (rhs M__M), REAL v_v, REAL_REAL M_b];
249 (Rewrite ''Moment_Neigung'' ) #> (Rewrite ''make_fun_explicit'' )) M__M;
250 N__N = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
251 [''diff'', ''integration'', ''named'']) [REAL (rhs N__N), REAL v_v, REAL_REAL id_abl];
252 B__B = SubProblem (''Biegelinie'', [''named'', ''integrate'', ''function''],
253 [''diff'', ''integration'', ''named'']) [REAL (rhs N__N), REAL v_v, REAL_REAL id_fun]
255 [Q__Q, M__M, N__N, B__B])"
256 setup \<open>KEStore_Elems.add_mets
257 [Specify.prep_met @{theory} "met_biege_ausbelast" [] Celem.e_metID
258 (["Biegelinien", "ausBelastung"],
259 [("#Given" ,["Streckenlast q__q", "FunktionsVariable v_v",
260 "Biegelinie id_fun", "AbleitungBiegelinie id_abl"]),
261 ("#Find" ,["Funktionen fun_s"])],
262 {rew_ord'="tless_true",
263 rls' = Rule_Set.append_rules "erls_ausBelastung" Rule_Set.empty
264 [Rule.Eval ("Prog_Expr.ident", Prog_Expr.eval_ident "#ident_"),
265 Rule.Thm ("not_true", ThmC.numerals_to_Free @{thm not_true}),
266 Rule.Thm ("not_false", ThmC.numerals_to_Free @{thm not_false})],
268 srls = Rule_Set.append_rules "srls_ausBelastung" Rule_Set.empty
269 [Rule.Eval ("Prog_Expr.rhs", Prog_Expr.eval_rhs "eval_rhs_")],
270 prls = Rule_Set.empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.empty},
271 @{thm belastung_zu_biegelinie.simps})]
273 subsection \<open>Substitute the constraints into the equations\<close>
275 partial_function (tailrec) setzte_randbedingungen :: "bool list \<Rightarrow> bool list \<Rightarrow> bool list"
277 "setzte_randbedingungen fun_s r_b = (
280 f_s = filter_sameFunId (lhs b_1) fun_s;
281 e_1 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
282 [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_1];
284 f_s = filter_sameFunId (lhs b_2) fun_s;
285 e_2 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
286 [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_2];
288 f_s = filter_sameFunId (lhs b_3) fun_s;
289 e_3 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
290 [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_3];
292 f_s = filter_sameFunId (lhs b_4) fun_s;
293 e_4 = SubProblem (''Biegelinie'', [''makeFunctionTo'', ''equation''],
294 [''Equation'', ''fromFunction'']) [BOOL (hd f_s), BOOL b_4]
296 [e_1, e_2, e_3, e_4])"
297 setup \<open>KEStore_Elems.add_mets
298 [Specify.prep_met @{theory} "met_biege_setzrand" [] Celem.e_metID
299 (["Biegelinien", "setzeRandbedingungenEin"],
300 [("#Given" , ["Funktionen fun_s", "Randbedingungen r_b"]),
301 ("#Find" , ["Gleichungen equs'''"])],
302 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [], srls = srls2, prls=Rule_Set.empty, crls = Atools_erls,
303 errpats = [], nrls = Rule_Set.empty},
304 @{thm setzte_randbedingungen.simps})]
306 subsection \<open>Transform an equality into a function\<close>
308 (*(M_b x = c_2 + c * x + -1 * q_0 / 2 * x ^^^ 2) (M_b L = 0) -->
309 0 = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2*)
310 partial_function (tailrec) function_to_equality :: "bool \<Rightarrow> bool \<Rightarrow> bool"
312 "function_to_equality fu_n su_b = (
315 bd_v = argument_in (lhs fu_n);
316 va_l = argument_in (lhs su_b);
317 eq_u = Substitute [bd_v = va_l] fu_n; \<comment> \<open>([1], Res), M_b L = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2\<close>
318 eq_u = Substitute [su_b] eq_u
320 (Rewrite_Set ''norm_Rational'') eq_u)"
321 setup \<open>KEStore_Elems.add_mets
322 [Specify.prep_met @{theory} "met_equ_fromfun" [] Celem.e_metID
323 (["Equation","fromFunction"],
324 [("#Given" ,["functionEq fu_n","substitution su_b"]),
325 ("#Find" ,["equality equ'''"])],
326 {rew_ord'="tless_true", rls'=Rule_Set.Empty, calc = [],
327 srls = Rule_Set.append_rules "srls_in_EquationfromFunc" Rule_Set.empty
328 [Rule.Eval("Prog_Expr.lhs", Prog_Expr.eval_lhs "eval_lhs_"),
329 Rule.Eval("Prog_Expr.argument'_in", Prog_Expr.eval_argument_in "Prog_Expr.argument'_in")],
330 prls=Rule_Set.empty, crls = Atools_erls, errpats = [], nrls = Rule_Set.empty},
331 (*(M_b x = c_2 + c * x + -1 * q_0 / 2 * x ^^^ 2) (M_b L = 0) -->
332 0 = c_2 + c * L + -1 * q_0 / 2 * L ^^^ 2*)
333 @{thm function_to_equality.simps})]