بالطبع من الصعب للغاية معرفة التفاصيل حول جميع الأساليب ، ولكن بالنسبة لي يبدو هذا الموضوع مثيرًا للاهتمام ومهمًا للغاية ، حيث يواجه الجميع مهمة إيجاد حل في كثير من الأحيان. في المقال الأول
لماذا غاوس؟ تم وصف طريقة غاوس (بما في ذلك التعديلات) وبعض الطرق التكرارية. ومع ذلك ، نظرًا لانتقادات
سن3 ، قررت أن أصف طرقًا أخرى أيضًا.
ابدأ من جديد
لذا ، دعونا نحتاج مرة أخرى إلى حل نظام معادلات جبرية خطية للنظام
. واحدة من أكثر الطرق العددية اللافتة للنظر هي الطريقة المستخدمة
- تكوين المصفوفة.
هذه الطريقة الحدسية هي كما يلي. لنفترض أن لدينا نظامًا من المعادلات الجبرية الخطية (مكتوبة بشكل متجه):
أين
- مصفوفة رهيبة وغير مربكة. نحن نمثلها كمنتج لمصفوفتين أخريين:
هي مصفوفة مثلثة أقل
هي المصفوفة المثلثية العلوية. ثم من الواضح أن النظام يأخذ الشكل:
إذا تم تعيينه
، ثم يتم العثور على حل النظام الأصلي من حل نظامين آخرين:
تكمن ميزة هذه الطريقة في أن حلول نظامين مساعدين بسيطة للغاية (بسبب حقيقة أن المصفوفات
و
- مثلث). ولكن هل من السهل العثور على هذه المصفوفات؟ لذلك ، يتم تقليل مهمة حل النظام إلى مهمة البناء
-تنسيقات المصفوفة.
وصف الخوارزمية المطبقة
يتم وصف التحلل بتفاصيل كافية
هنا . في غضون ذلك ، سنلقي نظرة على طريقة أخرى.
طريقة الجذر التربيعي
نفرض شروط إضافية على المصفوفة
. نطلب أن تكون متناظرة ، أي
أو
. يمكن تمثيل هذه المصفوفة على أنها
أين
- مصفوفة مثلثة علوية ،
هي مصفوفة
حقيقية قطرية ، وعناصرها القطرية تساوي الوحدة في القيمة المطلقة. وبالمثل ، تم تقليل النظام الأصلي إلى نظامين آخرين:
والتي يتم حلها أيضًا بشكل أساسي بسبب خصائص المصفوفات
و
.
اشتقاق الصيغ الخوارزمية مرهقة إلى حد ما ولا يزال خارج نطاق النشر. إذا رغبت في ذلك ، يمكن العثور عليها
هنا .
نموذج كود Java الذي يقوم بتنفيذ طريقة المسح:
import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class SquareRootMethod { public static void main(String[] args) throws FileNotFoundException { Scanner scanner = new Scanner(new FileReader("input.txt")); scanner.useLocale(Locale.US); int n = scanner.nextInt(); double[][] a = new double[n + 1][n + 1]; double[] b = new double[n + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { a[i][j] = scanner.nextDouble(); } b[i] = scanner.nextDouble(); } double[] x = new double[n + 1]; double[] d = new double[n + 1]; double[][] s = new double[n + 1][n + 1];
طريقة الاجتياح
باستخدام هذه الطريقة ، لا يمكن حل سوى أنظمة محددة لا تزيد عن ثلاثة مجهولين في كل صف. أي مع النظام
مصفوفة
ثلاثي الأبعاد:
A = \ start {pmatrix} C_1 & -B_1 & 0 & \ dots & 0 & 0 \\ -A_2 & C_2 & -B_2 & \ dots & 0 & 0 \\ \ vdots & \ vdots & \ vdots & \ ddots & \ vdots & \ vdots \\ 0 & 0 & \ dots & -A_ {n-1} & C_ {n-1} & -B_ {n-1} \\ 0 & 0 & \ dots & 0 & -A_n & C_n \\ \ end {pmatrix}.
فقط لاحظ أنه يوجد اتصال بين الحلول المجاورة:
- بعض الأرقام المجهولة. إذا وجدناها ومتغير واحد ، يمكننا أن نجد جميع المتغيرات الأخرى.
اشتقاق الصيغ
موجود
هنا . حسنًا ، في النهاية
لاحظ أنه في صيغ البحث
هناك قسمة على الرقم
والتي قد تتحول إلى صفر ويجب تتبعها. ولكن في الواقع ،
العبارة التالية سارية ، والدليل
هنا : خوارزمية المسح صحيحة ومستقرة إذا تم استيفاء الشروط:
ضع في اعتبارك كود برنامج Java الذي يحل النظام.
\ left \ {\ start {align} & x_1 = 0، \\ & x_ {i-1} + \ xi x_ {i + 1} = \ dfrac {i} {n}، \ (i = \ overline {2، n-1})، \\ & x_n = 1، \\ \ end {align} \ right.
في
.
package SystemOfLinearAlgebraicEquations; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.PrintWriter; import java.util.Locale; import java.util.Scanner; public class TridiagonalMatrixAlgorithm { public static void main(String[] args) throws FileNotFoundException { final int n = 21; double[] A = new double[n + 1]; double[] B = new double[n + 1]; double[] C = new double[n + 1]; double[] F = new double[n + 1]; double xi = 2; C[1] = 1; F[1] = 0; for(int i = 2; i <= n-1; i++) { A[i] = 1; C[i] = xi; B[i] = 1; F[i] = - (double) i / n; } A[n] = 0; C[n] = 1; F[n] = 1; double[] alpha = new double[n + 1]; double[] beta = new double[n + 1];