Witam, mam problem z napisaniem programu w C. Ma on obliczać miejsca zerowe funkcji a+sin(bx)+c metodą siecznych. Treść zadania: http://yojo2.ids.pl/c/1.jpg
Problem jest taki że niby mam kod, ale nie działa on poprawnie. Poprawne dane wypisuje tylko wtedy, gdy miejsce zerowe jest w x = 0. W innym przypadku wynik programu nie pokrywa się z rzeczywistością.
#include <stdio.h>
#include <math.h> // wymagane dla funkcji sin() i M_PI
#include <stdlib.h> // wymagane dla funckji atof()
float a, b, c, p, k;
double f(double z)
{
return (a*sin(b*z)+c); // funkcja obliczajaca wartosci rownania
}
double x(double q, double w)
{
return (w-f(w)*(w-q)/(f(w)-f(q))); // funkcja obliczajaca xi+1
}
int isNumber( char *t )
{
int tac = 0;
while( t[ tac ] != 0 )
{
if ( !(t[ tac ] == 45 || !t[ tac ] == 46 || ( t[ tac ] >= 48 && t[ tac ] <= 57 ) ) )
{
return 0;
}
tac++;
}
return 1;
}
int main()
{
int n = 1; // numer pierwszej iteracji
double xmin, xakt, xplus; // xmin=x0 (xi-1); xakt=x1 (xi); xplus=xi+1;
printf ("\nRozwiazywanie rownania a*sin(bx)+c=0. \nPodaj wspolczynniki a, b, c (oddzielone spacjami): ");
char ta[128], tb[128], tc[128];
scanf("%s %s %s", ta, tb, tc);
if (isNumber(ta) != 1 || isNumber(tb) != 1 || isNumber(tc) != 1)
{
printf("\nBlad! Parametr nie jest liczba!\n");
return -1;
}
a = atof(ta);
b = atof(tb);
c = atof(tc);
printf ("Podaj poczatek i koniec przedzialu (w stopniach, oddzielone spacjami): ");
char tp[128], tk[128];
scanf("%s %s", tp, tk);
if (isNumber(tp) != 1 || isNumber(tk) != 1)
{
printf("\nBlad! Przedzial nie jest liczba!\n");
return -1;
}
p = atof(tp);
k = atof(tk);
if (p == k) //wtedy w trakcie funkcji x nastepuje dzielenie przez 0
{
printf ("\nBlad! p nie moze byc rowne k!\n");
return 1;
}
if ((a==0 || b==0) && c==0) // wtedy wykres to prosta y = 0
{
printf ("\nRownanie jest spelnione dla kazdego rzeczywistego x.\n");
return 2;
}
if ((a==0 || b==0) && c!=0) // wtedy wykres to prosta y != 0
{
printf ("\nRownanie nie jest spelnione dla zadnego x.\n");
return 3;
}
if ((a>0 & c>0 && c>a) || (a<0 & c>0 && c>-a) || (a>0 & c<0 && -c>a) || (a<0 & c<0 && -c>-a)) // wtedy wykres nie ma przeciec z osia x
{
printf ("\nRownanie nie jest spelnione dla zadnego x.\n");
return 4;
}
xmin = p*M_PI/180;
xakt = k*M_PI/180;
xplus = x(xmin, xakt); // przypisanie x-om odpowiednich wartosci
if (xplus > xakt)
{
while ((xplus-xakt)/xplus > 0.001)
{
n++; // zwiekszenie numeru iteracji
xmin = xakt;
xakt = xplus;
xplus = x(xmin, xakt); // przejscie do kolejnej iteracji - zmiana wartosci x-ow
}
}
else
{
while ((xakt-xplus)/xplus > 0.001)
{
n++;
xmin = xakt;
xakt = xplus;
xplus = x(xmin, xakt);
}
}
printf ("\nRownanie jest spelnione dla x = %lf stopni. Liczba iteracji: %d.\n", xakt*180/M_PI, n);
return 0;
}
Można liczyć na pomoc?