بسم الله الرحمن الرحيم :)
طريقة ايجاد قاعدة الدالة المارة بعدد n من النقط علي المستوي الاحداثي
اذا كان لدينا نقطتين :
اي نقطتين تمر بهم خط مستقيم ولذلك اذا اعطيت نقطتين تكون الدالة علي الشكل
د( س ) = أس + ب ( حيث أ و ب ثابت )
مثال لدينا النقطتين ( 1 , 2 ) ( 2 , 1 )
بالتعويض بقيم س و د(س)
2 = أ + ب
1 = 2أ + ب
وتلك معادلة خطية سهلة الحل
اذا كان لدينا ثلاث نقط :
اي ثلاث نقط ان لم يكونو علي خط مستقيم فسيوجد دالة تربيعية تمر بهم
شكل الدالة التربيعية : د ( س ) = أ س^2 + ب س + ج
مثال : لدينا النقط ( 1 , 1 ) ( 2 , 4 ) ( 3 , 9 )
بالتعويض
1 = أ + ب + ج
4 = 4 أ + 2 ب + ج
9 = 9 أ + 3 ب + ج
معادلة خطية أيضا
اذا كان لدينا عدد n من النقط :
فإن الدالة في اسوأ الحالات ستكون من الدرجة n - 1 وسنكون معادلة خطية أيضا
د(س) = أ س^( n - 1 ) + ......... + ج
في أي حال من الأحوال تتكون معادلة خطية :D
طريقة Gaussian elimination في حل المعادلات الخطية
تعتمد علي وضع معاملات المتغيرات في مصفوفة مرفقة بنتائج المعادلة ونستخدم القسمة وطرح الصفوف لنصل لمصفوفة الوحدة
سنقوم بالتطبيق علي النقط ( 1 , 1 ) ( 2 , 4 ) ( 3 , 9 )
لدينا
1 = أ + ب + ج
4 = 4 أ + 2 ب + ج
9 = 9 أ + 3 ب + ج
نقوم بتنيظمها علي شكل مصفوفة كما بالصورة

الهدف من العملية هو ان نصل الي مصفوفة الوحدة

وبذلك نكون حصلنا علي قيم أ و ب و ج
طريقة العمل :
في كل عمود نقوم بقسمة الصف الذي يحتوي علي 1 ( في مصفوفة الوحدة ) علي نفسه حتي نحصل علي القيمة 1
نقوم بطرح الصفوف حتي نحصل علي القيم 0 ......
الصور ستوضح لنا
العمود الأول

لحسن حظنا القيمة تحتوي بالفعل علي 1 لذلك لا داعي للقسمة
نقوم بضرب الصف الأول في 4 ونطرحة من الصف الثاني حتي نحصل علي القيمة 0 في الصف الثاني العمود الأول

الان حصلنا علي القيمة 0 في المكان المراد ..
نقوم بضرب الصف الأول في 9 ونطرحة من الثالث حتي نحصل علي 0
العمود الثاني :
نقوم بالقسمة علي 2 في الصف الثاني حتي نحصل علي القيمة 1 كما في مصفوفة الوحدة

وهكذا نقوم الضرب في 1 ونطرحها من الصف الأول ثم نقوم بالضرب في 6 ونطرحها من الصف الثالث حتي نحصل علي 0
العمود الثالث :
نقوم بتكرار نفس العمليات حتي تكون المصفوفة علي شكل مصفوفة الوحدة

ومنها قيمة أ = 1 .... ب = ج = 0
اي
د(س) = س^2
تلك الفكرة التي استعملتها
عيوب الطريقة - من وجهة نظري :D - :
نقتطين = دالة خطية
ثلاث نقط = دالة تربيعية أو خطية
أربع نقط = دالة تكعيبية او تربيعية او خطية
ما أعنيه ان البرنامج من المستحيل ان يعطي دالة تكعيبية تمر بالنقط المعطاه مثلا اذا اعطيته اقل من 4 نقط لانه لا يمكن - عادة - حل معادلات عدد متغيراتها اكبر من عدد المعادلات ( سيوجد عدد لا نهائي من الحلول )
أحب استفيد من طرق تانية للحل ( لو كنت عارف طريقة تانية قولها :D )
الكود :
#include <iostream>#include <cmath>using namespace std;int number;long double AMatrix[20][20]= {0};long double solution[20]= {0};void subtract( int column , int row ){ float temp ; temp = AMatrix[row][column]; solution[row] -= (solution[column]*temp); for(int i = 0 ; i < number ; i++ ) { AMatrix[row] -= (AMatrix[column]*temp); } return ;}void divide( int row , int number ){ if(AMatrix[row][row]!=0) { float temp = AMatrix[row][row]; solution[row] /= temp; for( int i = 0 ; i < number ; i ++ ) { if( AMatrix[row] == temp ) AMatrix[row] = 1; else AMatrix[row] /= temp ; } } return ;}void solute(){ for( int column = 0 ; column < number ; column ++ ) { divide( column , number ); for ( int row = 0 ; row < number ; row ++ ) { if ( column != row ) subtract(column,row); } } return ;}void Around(){ for(int i = 0 ; i < number ; i++) { if( int(solution*10000) != solution*10000 ) { solution = int ( solution * 10000 ); solution += 5; solution = int(solution / 10); solution = solution / 1000; } }}void show(){ cout<<"f(x) = "; for(int i = 0 ; i < number ; i ++) { if( solution != 0 ) { if(solution > 0 ) cout<<"+"; if( ( solution != 1 && solution != -1 ) || number-i-1 == 0 ) cout << solution ; if(number-i-1 != 0 ) { cout<<"X"; if(number-i-1 != 1) cout<<"^"<<number-i-1; } } }}int main(){ cout << "How many points do you want to enter ? : "; cin >> number; for(int i = 0 ; i < number ; i ++) { int power = number; int a; cout << endl << " x = "; cin >> a; for( int x = 0 ; x < number ; x ++ ) { power -- ; AMatrix[x] = pow(a,power); } cout << " f(x) = "; cin >> solution; } for(int i = 0 ; i < number ; i ++) { if( AMatrix == 0 ) { for(int x = 0 ; x < number ; x++) { int temp = AMatrix[x]; AMatrix[x] = AMatrix[number-1][x]; AMatrix[number-1][x] = temp; } int temp = solution; solution = solution[number-1]; solution[number-1] = temp; } } solute( ); cout<<endl<<endl; Around(); show(); cout<<endl<<endl; return 0;}