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

مساعدة في طريقة جاكوبي لحل المعادلات الخطية

بدأه منذر الشيخ في 15 يناير 2012 · 3 رد · 1,508 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اخواني

لدي مشكلة و اتمنى منكم المساعدة

اريد اعمل برنامج يستخدم jacobi method to solve linear system

انا عملته و شغال بس اريد احد يساعدني كيف اخلي البرنامج يقرأ المعادلات من ملف txt

 void getInput( int numUnKnowns, double** mat )
{
    int i, j;

    printf
    (
	"\nEnter values for the specified row and column below ...\n"
	"(The last column is the value for the RHS of the equation.)\n"
    );

    for( i = 0 ; i < numUnKnowns ; i++ )
    {
	mat = (double*) malloc( (numUnKnowns+1)*sizeof(double) );
	puts("");
	for( j = 0 ; j < numUnKnowns+1 ; j++ )
	{
	    printf("matrix[%d][%d] : ", i, j);
	    if( scanf("%lf", &mat[j]) != 1 )
	    {
		--j;
		puts("Bad entry ... try again with a 'real' number.");
	    }
	    while( getchar() != '\n' ) ; /* flush stdin ... */
	}
    }

    printf("\nThe matrix entered:\n\n");
    for( i = 0 ; i < numUnKnowns ; i++ )
    {
	for( j = 0 ; j < numUnKnowns+1 ; j++ ) printf("%+9f ", mat[j]);
	puts("");
    }

    printf("\nPress 'Enter' to start iteration ... ");
    getchar();
}

/* Check if the matrix entered is strictly diagonally dominant */
int checkIfDD( int numUnKnowns, double** mat )
{
    int   m, n, dd = 0;
    double* chkdd;
    double* sumdd = (double*) malloc( numUnKnowns*sizeof(double) );
    chkdd = (double*) malloc( numUnKnowns*sizeof(double) );

    for( m = 0 ; m < numUnKnowns ; m++ )
    chkdd[m] = sumdd[m] = 0; /* all set to zero ... */

    printf("\nChecking if the matrix is (strictly) diagonally dominant...");

    for( m = 0 ; m < numUnKnowns ; m++ )
    {
	for( n = 0 ; n < numUnKnowns ; n++ )
	    sumdd[m] += fabs(mat[m][n] );
	sumdd[m] -= fabs(mat[m][m]);
	chkdd[m] = fabs(mat[m][m]);

	if(chkdd[m] > sumdd[m])
	{
	    printf("\n%f > %f",chkdd[m],sumdd[m]);
	    dd++;
	}
	else printf("\n%f !> %f",chkdd[m],sumdd[m]);
    }

    if(dd == numUnKnowns)
    {
	printf
	(
	    "\nYES ..."
	    "\nThe matrix is (strictly) diagonally dominant."
	    "\nPress 'Enter' to continue with 'Jacobi Iterative Method'...\n"
	);
	getchar();
    }
    else
    {
	printf
	(
	    "\nNO ..."
	    "\nThe matrix is NOT (strictly) diagonally dominant ... so STOP!"
	    "\n(But ... consider exchanging rows in the matrix "
	    "and then to try again.)"

	    "\n\nPress 'Enter' to continue ... "
	);

	getchar();
	free( sumdd );
	free( chkdd );
	return 0; /* false */
    }

    free( sumdd );
    free( chkdd );
    return 1; /* true */
}

مثال ان الملف يحتوي على معادلات

4x-2y-1z=4

2x+9y+z=3

x-3y-5y=9

#2

يبدو من الكود انة كود سي وليس سي++

اقتباس
انا عملته و شغال بس اريد احد يساعدني كيف اخلي البرنامج يقرأ المعادلات من ملف txt

أين الدالة الرئيسية وباقية الكود؟

ثانيا الكود يحتوى على مفهوم مؤشر الى مؤشر وهو مفهوم اصعب من الكتابة او الى ملف ...

يمكنك متابعة هذا الرابط

تم تعديل هذه المشاركة بواسطة محمد ابوزايد في 15 يناير 2012 في 19:41

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#3
محمد ابوزايد كتب:

يبدو من الكود انة كود سي وليس سي++

أين الدالة الرئيسية وباقية الكود؟

ثانيا الكود يحتوى على مفهوم مؤشر الى مؤشر وهو مفهوم اصعب من الكتابة او الى ملف ...

يمكنك متابعة هذا الرابط

تقصد الكود كامل؟ او كود jaconbi ?

void jacobiCalcDisplay( int numUnKnowns, double** mat )
{
    int* flag;
    int i, j, counter = 0;
    double* res;
    double* var = (double*) malloc( numUnKnowns*sizeof(double) );
    res = (double*) malloc( numUnKnowns*sizeof(double) );
    flag = (int*) malloc( numUnKnowns*sizeof(int) );

    for(i = 0 ; i < numUnKnowns ; i++ )
    var = res = flag = 0;
    printf("The initial value of each array element was set to zero ...\n\n");

    printf( "*********************\n");
    printf( "START CALCULATING ...\n");
    printf( "*********************\n");

    do
    {
	counter++;
	/* for each iteration keep a copy of the old results ... */
	for(i = 0 ; i < numUnKnowns ; i++ )
	{
	    var = res;
	}

	if( SHOW_ITERS ) printf("\nIteration number %d ...\n", counter);

	for(i = 0 ; i < numUnKnowns ; i++ ) /* calculation */
	{
	    res = mat[numUnKnowns];
	    for(j = 0 ; j < numUnKnowns ; j++ )
		res = res - mat[j]*var[j] ;

	    res = res + mat*var ;
	    res = res / mat ;
	    if( SHOW_ITERS ) printf("%c = %f\n", 'a'+i, res);
	    if( fabs(res - var) < EPSILON ) /* stop condition */
	    flag++;

	    if( counter==MAX_PRINT_ITERS) SHOW_ITERS = 0;
	}

    }while( !checkFlags( numUnKnowns, flag ) );

    printf( "\n********************************\n");
    printf( "The RESULTS of %d ITERATIONS ... \n", counter);
    printf( "********************************\n");

    /*  cross check ...*/

    for( i = 0 ; i < numUnKnowns ; i++)
	var = dotProd( numUnKnowns, mat, res );

    showXcheck( numUnKnowns, mat, res, var );

    /* show sol'n vector (again) ... and free up all dynamic memory  */

    printf("\nSolution vector ...\n");
    for( i = 0 ; i < numUnKnowns ; i++)
    {
	printf("%c = %+f\n", 'a'+i, res);
	free(mat);
    }
    free( mat );
    free( flag );
    free( res );
    free( var );
}
#4

نعم الكود بالكامل

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…