All pastes #280417 Raw Edit

Unnamed

public text v1 · immutable
·published 2006-12-15 22:11 UTC
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;
}