Wielomian jako funkcja double nazwa(double x)

0

Witam. Jestem początkującym jeśli chodzi o język C i mam problem z wprowadzeniem wielomianu do funkcji. Potrzebuję uzyskać funkcję z parametrem x, na której mógłbym przeprowadzić operację obliczania pierwiastków metodą Newtona. Część dotycząca metody Newtona działa poprawnie, gdy z góry w kodzie wprowadzam wzór funkcji i jej pochodnej. Chciałbym aby do zmiennej Y0 w 'case 5' podstawiało wcześniej pobraną od użytkownika funkcję wielomianową o całkowitych wykładnikach potęgi. Może ktoś doświadczony zauważy błąd i mi pomoże.

/* Użytkownik musi wprowadzić poniżej wzór funkcji :  ffunction
   oraz wzór obliczonej pochodnej funkcji : 		  dffunction 
   */


#include<stdio.h>
#include<stdlib.h>
#include<math.h>

#define NMAX 10		//maksymaly stopien wielomianu

/*  deklaracja funkcji i jej pochodnej  */

   double ffunction(double x);
    double dffunction(double x);


/* badana funkcja  */

    double ffunction(double x)
    {
	double fx=0;
   	float a[NMAX]; // tablice do przechowywania zadanego wielomianu 
  
  	unsigned int ilosc_jednomianow; 
  	int n; 
  	  	 
		for(n=ilosc_jednomianow; n>=0; n--) 
  		{ 
   			 fx=fx+a[n]*pow(x,n);
 		 } 
 		  	 		 
    return fx;
    }

/*  pochodna badanej funkcji */

   double dffunction(double x)

    {	
	double dfx=0;
	float a[NMAX]; // tablice do przechowywania zadanego wielomianu 
  
  	unsigned int ilosc_jednomianow; 
  	int n; 

  	 	 
 		 for(n=ilosc_jednomianow; n>0; n--)
 		 {
		  dfx=dfx+a[n]*n*pow(x,n-1);
 		 }
 		 
    return dfx;
    }


/*  główny program  */

    int main()
{
	    
    double eps;     /* tolerancja obliczonego pierwiastka */
    
    int nr;			/* zmienna w petli switch dla menu*/
    int mit;  		/* maksymalna liczba iteracji  */
    int st = 0;  	/* stan w jakim znajduje się program */
    int it;         /* licznik iteracji */
	double x;
    double X0;    /* punkt startowy obliczeń (musi byc blisko szukanego pierwiastka) */
    double X1;    /* nowy punkt stratowy */
    double Y0;    /* wartosć funkcji w punkcie X0 */
    double Y1;    /* wartosć funkcji w punkcie X1 */
    double Df;    /* wartosć pochodnej funkcji w punkcie X0 */
    double Dp;	  /* iloraz Y0/Df */	
    
    
	do				/*wieczna pętla while(1) na całym programie*/
   {
   /*MENU do switcha*/
   system("CLS");
   
   printf("-----------------------------------------------------\n");
   printf("Program liczacy pierwiastki wielomianu metoda Newtona\n");
   printf("-----------------------------------------------------\n");
   
   printf("1) Autor programu\n");
   printf("2) Instrukcja obslugi\n");
   printf("3) Wprowadzanie wspolczynnikow wielomianu\n");
   printf("4) Wprowadzanie parametrow obliczeniowych\n");
   printf("5) Pokaz wynik\n");
   printf("6) KONIEC\n");
   
   scanf("%d",&nr);			//wczytywanie numeru instrukcji z menu
   
   switch(nr)				/* pętla wyboru menu */
   {
   case 3:
   	{system("CLS");
   		
	// deklaracja zmiennych 
  	float a[NMAX]; // tablice do przechowywania zadanego wielomianu 
  
  	unsigned int ilosc_jednomianow; 
  	int n; 

  	// wprowadzanie danych 
  	printf("Podaj stopien wielomianu: "); 
  	scanf ("%d", &ilosc_jednomianow); 

  		for(n=ilosc_jednomianow; n>=0; n--) 
  		{ 
    		printf("Podaj wspolczynnik a%d: ", n); 
    		scanf("%f", &a[n]); 
      	} 

  	// wyswietlenie wprowadzonego wielomianu 
 	 printf("Wprowadzony wielomian to:\nf(x) = "); 
 	 
  		for(n=ilosc_jednomianow; n>=0; n--) 
  		{ 
   			 printf("%+5.2f*x^%2d",a[n], n); 
 		 } 
 	 printf("\n"); 
				    
   	}break; //koniec case 3
   
   
   case 4:					//wczytywanie parametrow do metody Newtona
   	{system("CLS");
   		printf("----------------------------------------------\n");
   		printf("Podaj maksymalna liczbe iteracji:\n");
   		scanf("%d",&mit);
   		printf("Podaj tolerowana dokladnosc wyznaczenia pierwiastka:\n");
   		scanf("%lf",&eps);
   		printf("Prosze podac punkt startowy obliczen bliski szukanemu pierwiastkowi!\n");
    	scanf("%lf",&X0);
    	printf("----------------------------------------------\n");
    	printf("Punkt startowy: %lf\n",X0);
    	printf("Tolerowana dokladnosc: %lf\n",eps);
    	printf("Maksymalna liczbe iteracji: %d\n",mit);
    	printf("----------------------------------------------\n");
    	
    }break;
   	   
   case 5:					//procedura obliczania pierwiastka metoda Newtona
   	{system("CLS");
   		printf("----------------------------------------------\n");
    	
    	Y0 = ffunction(X0);					//WIELOMIAN PODSTAWIONY DO FUNKCJI NIE DZIALA I PO WYBORZE CASE 5 PRZERYWA PROGRAM!!!

    	for ( it = 1; it <= mit ; it++) 
		{
        	if(st) break;

        Df = dffunction(X0);    /* podstawienie pochodnej funkcji w pkt. X0 do zmiennej Df  */

         	if( Df == 0)
			{       			/* sprawdzenie czy pochodna w pkt. X0 ma wartosć 0 */
             st = 1;
             Dp   = 0;
         	}

         	else Dp = Y0/Df;		/* jesli pochodna jest różna od 0 to do zmiennej Dp podstawiamy iloraz funkcji i jej pochodnej w pkt. X0 */

        	X1 = X0 - Dp;      		/* obliczanie nowego punktu wyjsciowego */
        	Y1 = ffunction(X1);   	/* wartosc funkcji dla nowego pkt. X1 */
      
        	if( (fabs(X1-X0) < eps) ) 
			{ 								/* sprawdzenie czy moduł róznicy pkt. X0 i X1 jest mniejszy od tolerowanej wartosci   */

            	if( st != 1) st = 2;        /* jesli stan rozny od 1 czyli pochodna rozna od 0 to komunikat o znalezieniu pierwiastka */

        	}

        X0 = X1;
        Y0 = Y1;
    	}				//koniec petli for

    	printf("----------------------------------------------\n");
    	printf("liczba iteracji: %d \n Pierwiastek: %lf\n",it-1, X1);
    	printf(" y0/df %lf\n",Dp);
    	printf("Wartosc funkcji f(x) w danym punkcie: %lf\n",Y1);
    	printf("----------------------------------------------\n");

		if(st == 0) printf("Limit iteracji zostal osiagniety!\n");

		if(st == 1) printf("Pochodna funkcji w podanym punkcie poczatkowym jest rowna zero!\n");

		if(st == 2) printf("Pierwiastek zostal znaleziony z podana dokladnoscia eps!\n");

    	printf("----------------------------------------------\n");
	}
    break;	/*koniec case 5*/
    
    case 6:			//konczy program
    	{system("CLS");
		
    	return 0;
    	}
	}	/*koniec switcha*/

system("PAUSE");	
}while(1);

}   /* koniec głównego programu */
1
function wielomian(double x,double abc[],unsigned stopien)
  {
   double y=0;
   ++stopien;
   while(stopien) y=y*x+abc[--stopien];
   return y;
  }

5x^2+3x+7
double abc[]={7,3,5};
double y=wielomian(x,abc,2);

1 użytkowników online, w tym zalogowanych: 0, gości: 1