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 */