بسم الله الرحمن الرحيم
------------------------
الموضوع مفتوح والكمال لله وحده
وكما أوضحت في موضوع سابق عجز برنامج Microsoft_Math.3 عن إيجاد حل بعض كثيرات الحدود
فليس منطقيا أن يكون برنامجنا كاملا من المحاولة الأولى
وفي الحقيقة لم أكن متحمسا لبدء الموضوع خاصة مع نوعية الأشخاص التي سخرت من فكرة الموضوع
ومن قارن البرنامج بماتلاب أو مابل أو Math.3 ولم ينتبه أن الموضوع فكرة ناتجة عن مجهود فردي محدود مقارنة بتلك الأسماء
ولكن ما يهمني هو نقل العلم ولو كان مثقال ذرة وإن شاء الله أوفق في ذلك:
=======================================================================
نسخة البرنامج الأخيرة
http://www.raffe3.com/download.php?filename=9ed9cda600.rar
1- مجال الدراسة (مجال التجريب) :
--------------------------------------
أي كثير حدود ينتج عن جداء
(x-x1)*(x-x2)*(...
x-x1 الحل هو x=x1
x-x2 الحل هو x=x2
(x^2 +(-x1-x2)*x +x1*x2)*(....
بعد التأمل في الملاحظة السابقة:
نوجد أكبر أعداد المجموعة : {a0/an , a1/an , a2/an , … , an-1/an}
وليكن بالقيمة المطلقة x
نلاحظ أن الحلول محصورة بالمجال [-x,+x]
X^2 +2x -3
---------------
مجال الدراسة:
{ a0/an , a1/an }
{ -3/1 , 2/1 }
أكبر الأعداد بالقيمة المطلقة هو 3
فيكون مجال الدراسة [-3,3]
وكما نلاحظ الحلول محصورة داخل المجال
وهي الفكرة الأولى
2- طريقة دراسة المجال:
--------------------------
-----------------------------------------------------------------------------------------
ملاحظة (الأكواد التالية هي أدوات شرح وليست حقيقية – سنبدأ بالأكواد الحقيقية لاحقا)
----------------------------------------------------------------------------------------
أي كثير حدود (بقاعدة ربط وحيدة) هو تابع مستمر وعندما يتحول التابع المستمر من القيمة السالبة إلى الموجبة أو العكس فقد مر بالقيمة صفر
لو لم يكن وقت تنفيذ البرنامج بالحسبان لكان الحل بالشكل التالي
X0 = -x
1
F = F (x0
While x0 < +x
If F(x0) = 0 then wrilteln(x0)
X0 = x0 + 0.00001
Goto 1
End while
ولكن هذه الطريقة مستحيلة وسيتوقف معها الكومبيوتر خاصة مع توابع بأمثال كبيرة جدا
تعتمد فكرة الحل على طريقة العداد داخل عداد (Label)
X0 = -x
F = F(x0
If F > 0 Then GoTo 1
If F < 0 Then GoTo 2
1:
if x0 > +x then Exit Sub
While F >0 and x0 < +x
F = F(x0)
X0 = x0 +0.1
End while
If F <= 0 then
L1 = x0 – 0.1
L2 = x0
في Label 1 عند ملاحظة البرنامج تحول قيمة التابع بالشكل (موجب –سالب) سيتوقف ويضع المجال التالي قيد الدراسة
أصبح مجال الدراسة هو [L1,L2]
(ما زلنا في Label 1 )
والآن نضع عداد جديد داخل المجال المذكور
S = L1
F = F(s
While F >0 and s<L2
S = s+ 0.00001
F = F(s
End while
ListBox1.Items.Add(s)
Goto 2
بعد أن تحول التابع للقيمة السالبة يتحول البرنامج إلى Label 2
ونضع عداد داخل عداد بشكل مشابه للحالة الأولى طبعا مع عكس متراجحة F
2:
if x0 > +x then Exit Sub
While F < 0 and x0 < +x
F = F(x0)
X0 = x0 +0.1
End while
If F >= 0 then
L1 = x0 – 0.1
L2 = x0
S = L1
F = F(s
While F < 0 and s < L2
S = s+ 0.00001
F = F(s)
End while
ListBox1.Items.Add(s)
Goto 1
وبذلك نكون قد جمعنا الدقة والسرعة
كل ما سبق هو فكرة مبدئية للبرنامج تقع بالمشاكل التالية:
----------------------------------------------------------
1- نفاط التماس:
-------------------
عند وجود نقطة تماس بقيمة عشرية أصغر من عداد الدراسة ستنتج الحالة التالية
البرنامج سيلاحظ أن قيمة التابع هي (سالب – سالب) وبذلك لن يتوقف وينشئ مجال دراسة صغير [L1,L2]
إلا إذا صادف العداد قيمة نقطة التماس
وبذلك نكون قد ضيعنا أحد الحلول
2- تغير مكثف للتابع ضمن مجال الدراسة
-------------------------------------------
وهنا كحالة مشابها للحالة الأولى لن يشعر البرنامج بتغير قيمة التابع بين الموجب والسالب والعكس
سأبدأ بالحديث عن عداد الدراسة قبل الوصول لحل المشاكل السابقة:
----------------------------------------------------------------
إن عداد الدراسة x0 يتزايد بقيمة يجب أن تكون تتبع لطول المجال وليست ثابتة كما في الأعلى
(x0 =x0 +0.1)
نلاحظ التابع
X^2 +2x -3
---------------
مجال الدراسة:
{ a0/an , a1/an }
{ -3/1 , 2/1 }
أكبر الأعداد بالقيمة المطلقة هو 3
فيكون مجال الدراسة [-3,3]
وكما نلاحظ الحلول محصورة داخل المجال
مجال دراسة التابع السابق صغيرة جدا فيمكننا تصغير زيادة العداد
X0 = X0 +0.0001
أما مع توابع قد يصل مجال الدراسة إلى 100000 مثلا
فيجب تصغير الزيادة لعداد الدراسة
X0 = X0 +0.1
ولنشمل جميع الحالات
X0 = X0 +e
قيمة e تتبع لطول المجال
e = 1
IF X<100000
e = 0.1
IF X<10000
e = 0.01
IF X<1000
e = 0.001
IF X<100
e = 0.0001
IF X<10
e = 0.00001
عندما يكون مجال الدراسة صغير لن يقع البرنامج بالمشاكل السابقة
حل مشكلة نقاط التماس:
-------------------------
نقوم بدراسة مشتق التابع F بالطريقة السابقة وتحديد نقاط الإنعدام
إن نقاط إنعدام مشتق التابع هي النقط المسببة للمشاكل أثناء دراسة التابع
نضع حلول معادلة المشتق بمصفوفة B(i)
بعد الإنتهاء من دراسة المشتق والبدء بدراسة التابع المطلوب:
نطبق التغيير التالي:
عند اقتراب عداد الدراسة من نقط إنعدام المشتق نزيد من دقة العداد بالشكل التالي
IF X0 >B(i)-2e AND X0 <B(i)+2e Then
X0 =X0 +0.00001
هل سنقع بنفس الإشكال لنقاط التماس لمشتق التابع ؟
إن نقاط التماس لمشتق التابع لا تهمنا لأن نقطة التماس للمشتق لا يمكن أن تكون نقط تماس للتابع
نستفيد من دراسة مشتق التابع بتحديد نقط الشك(التماس)
طبعا يكفي دراسة مشتق واحد ولكن سأذكر الملاحظة التالية للفائدة:
عندما نشتق التابع فإن مجال دراسة المشتق سيصغر
وإذا قمنا بالإشتقاق مرة أخرى فإن مجال دراسة المشتق الجديد سيصغر أيضا
وبالنسبة لدراسة التوابع بالطريقة الأولى (كلما صغر المجال زادت الدقة)
وأترك الإستفادة من الملاحظة لخيال المبرمج
خلاصة:
--------
1- دراسة مشتق التابع بالطريقة الأولى
2- تحديد نقاط إنعدام المشتق إن وجدت لأنها نقاط شك بالنسبة للتابع F
3- دراسة التابع المطلوب بالطريقة الأولى مع اختلاف بسيط بعداد الدراسة عند الإقتراب من نقط الشك
إن شاء الله أكون قدمت شيء مفيد وليس مضيعة للوقت
--------------------------------------------------
الشكر للأخ عماد والأخ أمين على تشجيعي لبدء الموضوع
في المشاركة التالية سأتحدث عن الحلول العقدية بإذن الله













