الفرق بين 'عندما' و 'إذا' في OpenModelica?
-
21-12-2019 - |
سؤال
أنا جديدة على OpenModelica و لدي بضعة أسئلة بخصوص قانون 'BouncingBall.مو' التي توزع مع البرنامج كما في المثال التعليمات البرمجية.
1) ما هو الفرق بين 'عندما' و 'إذا'?
2)ما هو الغرض من متغير 'فو' في الكود ؟
3)في السطر(15) - "عندما {h <= 0.0 و الخامس <= 0.0 الأثر}",, لا يجب التعبير عن 'عندما' يكون كافيا كما "{h <= 0.0 و الخامس <= 0.0}" لأن هذا يصبح صحيح عندما يحدث تأثير, ما هو الغرض من تأثير(بالنسبة لي زائدة هنا) و ماذا فاصلة(,) قبل تأثير يعني ذلك ؟
model BouncingBall
parameter Real e = 0.7 "coefficient of restitution";
parameter Real g = 9.81 "gravity acceleration";
Real h(start = 1) "height of ball";
Real v "velocity of ball";
Boolean flying(start = true) "true, if ball is flying";
Boolean impact;
Real v_new;
Integer foo;
equation
impact = h <= 0.0;
foo = if impact then 1 else 2;
der(v) = if flying then -g else 0;
der(h) = v;
when {h <= 0.0 and v <= 0.0,impact} then
v_new = if edge(impact) then -e * pre(v) else 0;
flying = v_new > 0;
reinit(v, v_new);
end when;
end BouncingBall;
المحلول
حسنا, هذا عدد غير قليل من الأسئلة.اسمحوا لي أن أحاول الإجابة عليها:
ما هو الفرق بين
when
وif
.الأسئلة داخل
when
شرط فقط "نشط" في لحظة أن التعبيرات الشرطية المستخدمة فيwhen
شرط تصبح نشطة.في المقابل, المعادلات داخلif
العبارة صحيحة طالما أن التعبير الشرطي يبقى صحيحا.ما هو الغرض من
foo
?ربما التصور.ليس له تأثير واضح على النموذج الذي أستطيع أن أرى.
لماذا
impact
المدرجة فيwhen
البند.واحدة من المشاكل لديك ما يسمى زينو نظم مثل هذا هو أن تستمر ترتد إلى أجل غير مسمى مع أصغر وأصغر فترات.أظن
impact
العلم هنا هو من المفترض أن تشير عند النظام قد توقف كذاب.ويتم ذلك عادة عن طريق فحص للتأكد من أن التعبير الشرطيh<=0.0
يصبح فعلا كاذبة في بعض نقطة.لأن الحدث كشف يتضمن العددية tolerancing في بعض نقطة ارتفاع مستبعد لم يحصل خارج نطاق التسامح و تحتاج إلى الكشف عن هذا أو الكرة لم يرتد مرة أخرى و يستمر في الانخفاض.(من الصعب شرح ذلك في الواقع دون تشغيل المحاكاة و رؤية تأثير).ماذا
,
هل فيwhen
البند.النظر في ما يلي:
when {a, b} then
.الشيء هو, إذا كنت تريد أن يكون لهاwhen
شرط الزناد عندما إماa
أوb
يصبح صحيحا ، قد تعتقد أنك سوف اكتب كماwhen a or b then
.ولكن هذا غير صحيح لأن ذلك سوف يؤدي فقط عندما أولا واحد يصبح صحيحا.أن ترى هذا أفضل, النظر في هذا الكود:
a = time>1.0; b = time>2.0; when {a, b} then // Equation set 1 end when; when a or b then // Equation set 2 end when;
لذا المعادلة مجموعة 1 سوف تحصل على تنفيذها مرتين هنا لأنها سوف تحصل على تنفيذها عند a
يصبح صحيحا ثم مرة أخرى عندما b
يصبح صحيحا.ولكن المعادلة مجموعة 2 سوف تحصل فقط على تنفيذها مرة واحدة عندما a
يصبح صحيحا.ذلك لأن كل التعبير a or b
فقط يصبح صحيحا في لحظة واحدة.
هذه هي النقاط المشتركة من الارتباك حول when
.نأمل أن هذه التفسيرات مساعدة.