مرحباً بك في إجابة - موسوعة الأسئلة والإجابات الحرة
اطرح سؤالاً:


برمجة حل المعادلات الخطية

من إجابة
اذهب إلى: تصفح, البحث
Question red.png

سـؤال

كيف نحل معادلة خطية بعدد من المجاهيل بالاستعانة بأحدى لغات البرمجة؟

محتويات

[عدل]

رد

نحتاج أولاً لمعرفة الطرق الرياضياتية المتبعة في حل هذه المعادلات ومن ثم نترجم هذه الطرق إلى خوارزمات ويعاد كتابة هذه الخوارزمات بلغة برمجة متوافرة. من أفضل الطرق لحل معادلات خطية بعدد N من المجاهيل وN من المعادلات توجد طريقة كرامر وطريقة غاوس. المعادلة الأصلية في الرياضيات تكون بالصورة $$ \begin{align} a_{11}x_1 &+& a_{12}x_2 &+& \cdots & a_{1n}x_n &= &b_1\\ a_{21}x_1 &+& a_{22}x_2 &+& \cdots & a_{2n}x_n &= &b_2\\ \vdots & & \vdots & & \ddots&& \vdots \\ a_{n,1}x_1 &+& a_{n,2}x_2 &+& \cdots & a_{n,n}x_n & = &b_n \end{align}$$

[عدل] طريقة كرامر

(طالع أيضاً برمجة المحدد بطريقة كرامر) في طريقة كرامر Cramer’s Rule نقوم أولاً بإيجاد محدد المصفوفة بطريقة كرامر أيضاً ثم نقوم بإيجاد محدد المفصفوفة الفرعية المشتقة لكل مجهول على حدة. $$\begin{vmatrix} a_{1,1} & a_{1,2} & \dots & a_{1,n} \\ a_{2,1} & a_{2,2} & \dots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n,1} & a_{n,2} & \dots & a_{n,n} \end{vmatrix}$$ ويكون الحل لكل مجهول هو حاصل قسمة محدد هذا المتغير على المحدد الرئيسي. $$x_1 = \frac{\Delta x_1}{\Delta},\quad x_2=\frac{\Delta x_2}{\Delta},\quad \cdots x_n\frac{\Delta x_n}{\Delta}$$

[عدل] طريقة غاوس

تعرف هذه الطريقة بالحذف الغاوسي Gaussian elimination وفيها يتم تخفيض المصفوفة إلى مصفوفة مثلثية بتطبيق بعض خواص الصف الأساسية في المصفوفات. عند تحويل المصفوفة إلى مصفوفة مثلثية يصبح من السهولة بمكان إيجاد قيمة المحدد عبر ضرب عناصر القطر الرئيس في المصفوفة المثلثية ببعض. المصفوفة المثلثية هي حالة خاصة من المصفوفة المربعة حيث تكون عناصرها فوق القطر الرئيس أصفاراً وتعرف حينها بالمصفوفة المثلثية العليا أو تحت القطر الرئيس أصفاراً وتعرف بالمصفوفة المثلثية السفلى.

لتخفيض مصفوفة مربعة بتطبيق عمليات الصف الأساسية فإننا نعمل على طرح أحد الصفوف من صف آخر بعد ضربه بمعامل معين يساعدنا في التخلص أو عزل أحد المتغيرات (تصفير عنصر). في حال البرمجة يمكن الاتفاق على ترتيب العملية بحيث يتم أولاً عزل العنصر الأول من الصفوف التالية للصف الأول (في حال التحويل لمصفوفة مثلثية سفلية مثلاً) لتحويل كافة عناصر العمود الأول إلى أصفار ما عدا العنصر الأول بالطبع. تكرر بعدها العملية على جميع عناصر العمود الثاني الواقعة تحت القطر الرئيس لتصبح أصفاراً وهكذا تستمر العملية حتى تصبح المصفوف في صورة مثلثية سفلية. يمكن تعديل بسيط للخطوات السابقة لإنشاء مصفوفة مثلثية علوية. يمكن تطوير طريقة غاوس أكثر وهو ما تم بالفعل للخروج بطريقة أو حذف غاوس-جوردان لإيجاد معكوس المصفوفة.

[عدل] مثال

المثال التالي مقتبس من ويكيبييديا. لنفرض ان الغرض هو إيجاد ووصف الحل أو الحلول الممكنة إذا كان أي من نظام المعادلات الخطية التالية: \[\begin{align}2x + y - z & {} = 8 \quad & (L_1) \\-3x - y + 2z & {} = -11 \quad & (L_2) \\-2x + y + 2z & {} = -3 \quad & (L_3)\end{align}\]

تكون الخوارزمية كما يلي: إعزل \(x\) عن جميع المعادلات تحت \(L_1\), ومن ثم إعزل \(y\) عن جميع المعادلات تحت \(L_2\). هذا سيجعل النظام على صورة مثلثية. حينئذ، باستعمال التعويض الخلفي، يمكن حل كل واحدة غير معلومة.

في هذا المثال سوف يتم عزل \(x\) عن\(L_2\) بإضافة \(\begin{matrix}\frac{3}{2}\end{matrix} L_1\) إلى \(L_2\), كما يتم عزل \(x\) عن \(L_3\) بإضافة \(L_1\) إلى \(L_3\). بشكل رسمي:

\[L_2 + \frac{3}{2}L_1 \rightarrow L_2\] \[L_3 + L_1 \rightarrow L_3\]

والنتيجة تكون: \[2x + y - z = 8 \, \] \[\frac{1}{2}y + \frac{1}{2}z = 1 \, \] \[2y + z = 5 \, \]

والان بعزل \(y\) عن \(L_3\) بإضافة \(-4L_2\) إلى\(L_3\):

\[L_3 + -4L_2 \rightarrow L_3\]

تصبح النتيجة:

\[2x + y - z = 8 \, \] \[\frac{1}{2}y + \frac{1}{2}z = 1 \, \] \[-z = 1 \, \]

هذه النتيجة هي نظام معادلات خطية بالصورة المثلثية، وبالتالي يكون الجزء الأول من الخوارزمية قد اكتمل.

القسم الثاني وهو التعويض الخلفي يتكون من حل المجاهيل في ترتيب عكسي. وعليه يمكن بسهولة ملاحظة أن

\[z = -1 \quad (L_3)\]

وعليه, \(z\) يمكن تعويضها في \(L_2\), والتي يمكن حلها بسهولة لإيجاد

\[y = 3 \quad (L_2)\]

ثانيا, \(z\) و\(y\) يمكن تعويضها \(L_1\), والتي يمكن حلها لإيجاد

\[x = 2 \quad (L_1)\]

وبالتالي تم حل النظام.

[عدل] تطبيقات

فيما يلي بعض البرامج والتطبيقات البرمجية لحل نظم المعادلات الخطية. غالبية الشفرات المصدرية المكتوبة بلغة جافا سكربت مأخوذة من معالج الرياضيات التابع للموقع هنا: http://www.ejabah.info/Maths.

[عدل] ماتلاب

يدعم ماتلاب التعامل مع المصفوفات بسلاسة وكل ما علينا فعله هو تعريف مصفوفة المجاهيل ومصفوفة الحل وتطبيق قاعدة كرامر مباشرة. لو كانت لدينا المعادلة

x1 + 3x2 + 3x3 = 0
4x1 - 2x2 + x3 = -5
x1 + x2 + 2x3 = 3

فسنكتبها في سطر أوامر ماتلاب بالشكل:

 
 A= [1, 3, 3;
    4, -2, 1;
    1, 1, 2]

وسكتون النتيجة

 
A1=1   3   3
   4  -2   1  
   1   1   2

ولإيجاد المصفوفات الفرعية A1, A2, A3 سنكتب

 
A1= [0, 3, 3;
    -5, -2, 1;
    3, 1, 2]
 
A2= [1, 0, 3;
    4, -5, 1;
    1, 3, 2]
 
A3= [1, 3, 0;
    4, -2, -5;
    1, 1, 3]

ولإيجاد حل المصفوفات بطريقة كرامر سنكتب وسنحصل معها على النتائج:

 
x1 = det(A1) / det(A)
x1 = -5.25
 
x2 = det(A2) / det(A),
x2 = -4.75
 
x3 = det(A3) / det(A),
x3 = 6.5

[عدل] اكسل

Excel Linear System Equations01.png
Excel Linear System Equations02.png
Excel Linear System Equations03.png
Excel Linear System Equations04.png

يستطيع اكسل وهو أحد تطبيقات أوفيس الشهيرة التعامل مع المصفوفات والمعادلات الخطية أيضاً. فيما يلي سنشرح العملية خطوة بخطوة، بداية سنتعرف إلى مزايا اكسل وكيفية التعامل مع المصفوفات من خلاله. من لديه بعض أساسيات اكسل لابد أنه يعلم كيف يتعامل مع خلاياه وكيف يدخل الحسابات ويربط العلاقات بدلالة خلايا أخرى. لكن ما قد لا يعرفه البعض هو كيفية التعامل مع مصفوفات.

عند تعديل معلومة في خلية أو مجموعة خلايا في اكسل فإننا

  • نحدد الخلية أو الخلايا المراد تعديلها،
  • نكتب التعديلات اللازمة،
  • ثم نضغط على مفتاح الإدخال Enter ونحصل على النتيجة

لكن عند تعديل معلومة من مصفوفة في خلية أو مجموعة خلايا في اكسل فإن العملية تختلف قليلاً كما يلي

  • نحدد الخلية أو الخلايا المراد تعديلها،
  • نكتب التعديلات اللازمة، ثم نضغط على المفاتيح Ctrl Shift ثم Enter معاً ونحصل على النتيجة. سنلاحظ أننا عندما نقوم بهذه العملية بنجاح يتغير محتوى نسق المعلومة داخل الخلية إلى المعلومة التي كتبناها ولكن بين حاصرتي { }.

[عدل] خطوات العمل

  • افتح برنامج اكسل ثم قم بتعبئة خلاياه الأولى بمعلومات مصفوفة المجاهيل A كما في الصورة الأولى. كما تلاحظ يتم تعبئة الخلايا من A2 إلى D5.
  • حدد أو ظلل عدد مشابه من الخلايا من A ونحجزه لحساب معكوس المصفوفة A-1 = 1/A. الصورة الثانية توضح كيف حددنا الخلايا من F2 إلى I5.
  • قم بكتابة التعبير التالي في مربع الإدخال fx لحساب معكوس المصفوفة:

=MINVERSE(A2:D5)

ثم اضغط على المفاتيح CTRL SHIFT ENTER وليس على مفتاح الإدخال وحده (ابدأ بـCTRL و SHIFT ثم ENTER ثم ارفع  يديك عن لوحة المفاتيح)، يفترض أن تحصل على النتائج الموضحة في الصورة الثالثة وكذلك تأكد أن الصيغة أصبحت بالصورة
{=MINVERSE(A2:D5)}

  • قم بتعبئة عمود النتائج B وليكن في العمود K كما في الصورة الرابعة
  • حدد عدد مشابه لخلايا العمود B في العمود M
  • اكتب التعبير التالي لحساب عمود الحلول M

=MMULT(F2:I5,K2:K5)
ثم كرر نفس التأكيد بالضغط على المفاتيح CTRL SHIFT ENTER. ونكون بالتالي قد حصلنا على مجموعة الحل للمعادلة الخطية المعطاة.

[عدل] برمجة طريقة كرامر بلغة جافا سكربت

يمكن برمجة المحدد بطريقة كرامر والإفادة من خاصية المعاودة recursion بلغات البرمجة كما هو موضح من الشفرة المصدرية التالية بلغة جافا سكربت.

function det(m)
{
 var i=0, d=0, sign=1, dt=0;
 if(m.length == 2) d = m[0][0]*m[1][1] - m[0][1]*m[1][0];
 else for (i = 0; i<m.length; i++){
  d += sign*m[0][i]*det(MatrixRC(m,0,i));
  sign=-sign;
 }
    return d; 
}
function MatrixRC(m,r,c)
{
 var i=0, j=0, temp=[];
 for(i=0; i<m.length-1; i++)temp[i]=[];
 
 for(i=0; i<r; i++){
  for(j=0; j<c; j++)temp[i][j]=m[i][j];
  for(j=c+1; j<m[0].length; j++)temp[i][j-1]=m[i][j];
 }
 for(i=r+1; i<m.length; i++){
  for(j=0; j<c; j++)temp[i-1][j]=m[i][j];
  for(j=c+1; j<m[0].length; j++)temp[i-1][j-1]=m[i][j];
 }
 return temp;
}

[عدل] برمجة طريقة غاوس بلغة جافا سكربت

فيما يلي شفرة مصدرية بلغة جافا سكربت لحل المعادلات بطريقة غاوس.

function msolve(m)
{
	var i, j, k, m1, m2, n=m.length,factor,precision=1e9;
	m1=[];
	m2=[];
	m2=mcopy(m);
	for(k=1; k<n;k++)for(i=k; i<n; i++){
		factor = m2[i][k-1]/m2[k-1][k-1];
		for(j=0; j<=n;j++) m2[i][j] -= m2[k-1][j]*factor;
	}
	for(i=n-1; i>=0; i--){
		m1[i] = m2[i][n];
		for(j=n-1; j>i;j--) m1[i] -= m2[i][j]*m1[j];
		m1[i] /= m2[i][i];
		m1[i] = Math.round(m1[i]*precision)/precision;
	}
	return matrix(n,1,m1);
}

البرنامج السابق عبارة عن دالة تدعى msolve ومدخلاتها هي مصفوفة m ذات N من الصفوف وN+1 من الأعمدة حيث يكون العمود الإضافي عبارة عن نتائج المعادلات أو الثوابت. يستعين البرنامج أيضاً بدالة لا تنتمي لمكتبة جافاسكربت وهي دالة المصفوفة matrix ووظيفتها إعادة ترتيب المخرجات بشكل مصفوفة.

[عدل] مثال

لتكن لدينا 9 معادلات مؤلفة من 9 مجاهيل بالصورة:

x1 + 2 x2 + 30 x3 + 4 x4 + 5 x5 - 6 x6 + 17 x7 + 8 x8 + 9 x9 = -10

-2 x1 - 7 x2 + 11 x3 + 12 x4 + 13 x5 - 14 x6 + 15 x7 + 16 x8 = 1

6 x1 + 7 x4 - 17 x5 + 18 x6 + 19 x7 + 20 x8 + x9 = 1

3 x1 + 4 x2 + 5 x4 - 3 x5 + 7 x6 + 4 x7 + 3 x8 + 2 x9 = 1

2 x1 + 3 x2 + 6 x3 + 5 x4 + 4 x5 + 6 x6 + 7 x7 + 8 x8 + x9 = 3

4 x1 - 6 x2 + 7 x3 + 9 x4 + 10 x5 + 34 x6 - 12 x7 + 9 x8 + 7 x9 = 0

6 x1 + 2 x2 + 3 x3 + 6 x4 + 5 x5 + 4 x6 + 2 x7 + 7 x8 + 3 x9 = 4

2 x1 + 7 x2 + 5 x3 + 6 x5 + 5 x6 + 14 x7 + 35 x9 = 4

16 x1 + 7 x2 + 8 x3 + x4 + 16 x5 + 7 x6 + 8 x7 + x8 + 9 x9 = 1

فسنعيد تعبئتها في مصفوفة أحادية البعد بدلالة المجاهيل بالإضافة للنتائج ونستدعي الدالة بالصورة:

m = matrix(9,10,[1, 2, 30,4,5, -6,17,8,9,-10,-2,-7,11,12,13, -14,15, 16,0,1,6,0,0,7,-17,18,19,20,1,1,3,4,0, 5,-3,7,4,3,2,1,2,3,6,5, 4,6,7,8,1,3, 4,-6,7,9,10, 34,-12,9,7,0,6,2,3,6,5,4,2,7,3,4,2,7, 5,0,6,5,14, 0,35,4, 16,7,8,1,16, 7,8,1,9,1])

حيث ستقوم هذه الدالة بترتيب المدخلات السابقة لتصبح

m =
  1   , 2   , 30  , 4   , 5   , -6  , 17  , 8   , 9   , -10

, -2  , -7  , 11  , 12  , 13  , -14 , 15  , 16  , 0   , 1

, 6   , 0   , 0   , 7   , -17 , 18  , 19  , 20  , 1   , 1

, 3   , 4   , 0   , 5   , -3  , 7   , 4   , 3   , 2   , 1

, 2   , 3   , 6   , 5   , 4   , 6   , 7   , 8   , 1   , 3

, 4   , -6  , 7   , 9   , 10  , 34  , -12 , 9   , 7   , 0

, 6   , 2   , 3   , 6   , 5   , 4   , 2   , 7   , 3   , 4

, 2   , 7   , 5   , 0   , 6   , 5   , 14  , 0   , 35  , 4

, 16  , 7   , 8   , 1   , 16  , 7   , 8   , 1   , 9   , 1

وعند استدعاء دالة الحل نكتب:

msolve(m)

فتكون النتيجة عمود من القيم تحاكي كل من x1و x2، ... حتى x9 على الترتيب بالصورة:

msolve(m)
  =
	-0.245097633

,	0.804032566

,	-0.51215244

,	-0.274392315

,	0.310601861

,	-0.117290666

,	-0.319876855

,	0.886417289

,	0.132109987

[عدل] أسئلة ذات صلة

قد ترغب أيضاً التعرف على

[عدل] أسئلة متنوعة

[عدل] برمجة

  • برمجة حاسبة بلغة جافا سكربت والويب
  • الأمر L في تطبيق Debug
  • قسمة كثيرة حدود بلغة جافا سكربت
  • الأمر N في تطبيق Debug
  • برنامج بلغة التجميع (الأسمبلي) يعرض مجموع رقمين
  • كيف يقرأ الحاسب الجذر التربيعي؟
  • الأمر E في تطبيق Debug
  • أوامر DEBUG في نظام دوس
  • الأمر U في تطبيق Debug
  • هل يمكن استخدام المعالجة المتوازية لتسريع تنفيذ العمليات في الحواسيب احادية المعالج " احادية النواة " ؟
  • [عدل] رياضيات

  • ماهو الاقتران العكسي لـ 2س^3-3س^2+6س
  • ما هي قيمة الوحدة التخيلية مرفوعة لنفسها i^i
  • ما هو مفكوك تايلور لمعكوس دالة الجيب؟
  • كيف يحسب ثابت الدائرة بواسطة الرياضيات
  • ما هي أسهل الطرق لحل المعادلات الخطية ذات 3 مجاهيل أو أكثر؟
  • ما هي جذور المعادلة 2x + 10/(x^3+1) - 4 وهل هي كثيرة حدود؟
  • رسم عمودي على مستقيم ويقطع نقطة محددة بواسطة الفرجار
  • ماهي المعادلة التفاضلية الجزئية التي يكون حلها هو F=ma
  • أولويات العمليات الحسابية
  • رسم عمودي على مستقيم بواسطة الفرجار
  • [عدل] علوم

  • ماهي المعادلة التفاضلية الجزئية التي يكون حلها هو F=ma
  • لماذا ينحرف الهلال قليلاً عن الأفق على مدار السنة؟
  • أثبت أن للفوتونات زخم (طاقة حركية ) .
  • ما هو قانون حساب الحرارة الناتجة عن المقاومة الكهربائية بالدرجة المئوية
  • هل يختلف الوزن من كوكب لآخر؟
  • لعبة Kamikaze Aliens IV لغة كيوبيسك
  • أدوات شخصية

    المتغيرات
    النطاقات
    أفعال
    إبحار
    أسئلة وإجابات
    مجالات علمية
    مجالات ثقافية وترفيه
    صندوق الأدوات
    برامج تحتاجها