spravil som algoritmus podla postupu na obrazku ale dava mi to nezmyselne vysledky , algoritmus by mal najst miimum funkcie na danom intervale , prikladam aj svoj algoritmus , ak by niekto v nom nasiel chybu bol by som vdacny za radu ako ju napravit.(v pripade x*x funkcie by malo byt minimum 0,0)
Kód: Vybrať všetko
double f(double x) { // funkcia na ktorej hladam minimum
double funkcia = x*x;
return funkcia;
}
int* fibonacci(int n) { // vytvori pozadovane dlhu fib postupnost
int* pole = (int*)malloc(n*sizeof(int));
pole[0] = 1;
pole[1] = 1;
for (int i = 2; i < n; i++) {
pole[i] = pole[i - 2] + pole[i - 1];
}
return pole;
}
int fibS(int Fn) { // zisti ako dlha ma byt fib postupnost
int x1 = 1;
int x2 = 1;
int x = 0;
int i = 2;
while (Fn > x) {
x = x1 + x2;
x1 = x2;
x2 = x;
i++;
}
return i;
}
void mfn(double a , double b , double d , double e) {
if (e < 0)
printf("presnost nesmie byt mensia ako 0\n");
else if (a>b)
printf("zaciatok intervalu nesmie byt vacsi ako koniec\n");
else {
double Fn = (b - a) / (e*(1 - d / 2));
int n = fibS(Fn);
int* F = fibonacci(n);
n = n - 1;
Fn = F[n];
if (n >= 2) {
double c1 = a + (b - a)*(F[n - 2] / Fn);
double f1 = f(c1);
double c2;
double f2;
int k = n;
if (n == 2) {
c2 = c1 + d;
f2 = f(c2);
}
else {
c2 = a + (b - a)*(F[n - 1] / Fn);
f2 = f(c2);
k = n - 1;
}
for (; k > 0; k--) {
if (f1 < f2) {
b = c2;
c2 = c1;
f2 = f1;
if (k == 1) {
c1 = c2 - d;
f1 = f(c1);
}
else {
c1 = a + (b - a)*(F[k - 1] / F[k + 1]);
f1 = f(c1);
continue;
}
}
if (f1 >= f2) {
a = c1;
c1 = c2;
f1 = f2;
if (k == 1) {
c2 = c1 + d;
f2 = f(c2);
}
else {
c2 = a + (b - a)*(F[k] / F[k + 1]);
f2 = f(c2);
continue;
}
}
}
if (f1 < f2)
b = c2;
else
a = c1;
}
printf("X0 je z intervlu (%lf,%lf)", a, b);
}
}
int main() {
mfn(-5,5,0.00001,0.0001);
return 0;
}
kod funguje len v pripade kladneho intervalu [a,b] , ak je napriklad [2,10] tak to najde spravne riesenie , v pripade ak je [-5,5] tak uz to blbne (iba pri parnych mocninach x , teda x^2 , x^4 ... )