13 12 2014 20:25
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <float.h>
double solve (double(*method)(double(*)(double,double),double,double,double,double),double(*f)(double,double),double a,double b,double t,double eps)
{
return method(f, a, b, t, eps);
}
double f1 (double x, double t)
{
if (x != 0.0)
{
return cos(t/x) - 2.0*sin(1.0/x) + 1.0/x;
}
else
{
printf("Помилка. Ділення на нуль. f1(%lf, %lf)\n", x, t);
exit(-1);
}
}
double f2 (double x, double t)
{
if (x > 0.0)
{
return sin(log(x)) - cos(log(x)) + t*log(x);
}
else
{
printf("Помилка. Ділення на нуль. f1(%lf, %lf)\n", x, t);
exit(-1);
}
}
double newton (double (*f)(double, double), double a, double b, double t, double eps )
{
if (f != NULL)
{
double x0 = b;
double x1 = x0;
for (int i = 0; i <= 1000; ++i)
{
double y = f(b, t);
double ydiff = (f(b+1e-10, t) - f(b, t))/1e-10;
if (fabs(ydiff) == 0.0)
{
printf("Помилка. Похідна дорівнює нулю. newton(%p, %lf, %lf, %lf, %lf)\n", f, a, b, t, eps);
exit(-1);
}
x1 = x0 - y/ydiff;
if(fabs(x1 - x0)/fabs(x1) < eps)
{
return x1;
}
x0 = x1;
}
printf("Помилка. Кількість ітерацій перевищила 1000. newton(%p, %lf, %lf, %lf, %lf)\n", f, a, b, t, eps);
exit(-1);
}
else
{
printf("Помилка. Нульовий покажчик на функцію. newton(%p, %lf, %lf, %lf, %lf)\n", f, a, b, t, eps);
exit(-1);
}
}
double bisec (double (*f)(double, double), double a, double b, double t, double eps )
{
if (f != NULL)
{
return 0;
}
else
{
printf("Помилка. Нульовий покажчик на функцію. newton(%p, %lf, %lf, %lf, %lf)\n", f, a, b, t, eps);
exit(-1);
}
}
int main(void)
{
printf("%lf", solve(newton,
f1,
-2.0,
2.0,
2.0,
0.0001
));
return 0;
}
|
run
| edit
| history
| help
|
0
|
|
|