الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

حل : ايجاد الدالة المارة بنقط معينة

بدأه أحمد عصام في 9 يناير 2014 · 0 رد · 958 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1

بسم الله الرحمن الرحيم :)

طريقة ايجاد قاعدة الدالة المارة بعدد 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 ب + ج

 

نقوم بتنيظمها علي شكل مصفوفة كما بالصورة

image.png

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

image.png

وبذلك نكون حصلنا علي قيم أ و ب و ج

طريقة العمل : 

في كل عمود نقوم بقسمة الصف الذي يحتوي علي 1 ( في مصفوفة الوحدة ) علي نفسه حتي نحصل علي القيمة 1

نقوم بطرح الصفوف حتي نحصل علي القيم 0 ......

 

الصور ستوضح لنا

 

العمود الأول

image.png

لحسن حظنا القيمة تحتوي بالفعل علي 1 لذلك لا داعي للقسمة

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

image.png

الان حصلنا علي القيمة 0 في المكان المراد .. 

نقوم بضرب الصف الأول في 9 ونطرحة من الثالث حتي نحصل علي 0

 

العمود الثاني :

نقوم بالقسمة علي 2 في الصف الثاني حتي نحصل علي القيمة 1 كما في مصفوفة الوحدة

image.png

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

 

العمود الثالث :

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

image.png

ومنها قيمة أ = 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;}

تم تعديل هذه المشاركة بواسطة أحمد عصام في 9 يناير 2014 في 13:21

2

مواضيع مشابهة