rendered paste body#include <math.h>
#include <stdio.h>
typedef float (*floatFunc) (float);
float test(float x) {
return (x-2)*(x-2);
}
void swap(float *x, float *y)
{
float t;
t = *x;
*x = *y;
*y = t;
}
float goldenRationMinimum (floatFunc f,float a, float b) {
int i=0;
// liczba iteracji
//
int n=10000;
// zloty podzial
float k=(float) sqrt((float) 5)/2;
k-=0.5;
// wartosci funkcji
float f1;
float f2;
// parametry z kroku i
float x1;
float x2; // obliczane
// dlugosc przedzialu poddana proporcji,
// potrzebna do wyznaczenia
// pierwszych x1,x2
float distance=b-a;
distance*=k;
// parametry z kroku i-1, ustawiamy bo pierwszy
// krok u nas jest 0
float _a=a,_b=b;
// trzeba pomyslec czy nie warto z*
float _x1=b - distance;
float _x2=a + distance;
float xmin,fmin;
for (i=1;i<n;i++) {
f1=*f(a);
f2=*f(b);
if (f1-f2) {
a=_a;
b=_x2;
x2=_x1;
distance=b-_a;
distance*=k;
x1=b-distance;
}
else {
a=_x1;
b=_b;
x1=_x2;
distance=_b-a;
distance*=k;
x2=a+distance;
}
swap(&a,&_a);
swap(&b,&_b);
swap(&x1,&_x1);
swap(&x2,&_x2);
}
swap(&a,&_a);
swap(&b,&_b);
swap(&x1,&_x1);
swap(&x2,&_x2);
xmin=b-a;
xmin/=2.0;
fmin=*f(xmin);
printf ("minimum (%f,%f)\n",xmin,fmin);
return xmin;
}
int main() {
float r=goldenRationMinimum(test,0,3);
return 0;
}