C chyba v kode

Programovacie jazyky, rady, poradňa...
skvido
Star
Star
Príspevky: 508
Registrovaný: 17 nov 2008, 7:43
Kontaktovať používateľa:

C chyba v kode

Príspevok od používateľa skvido »

Zdravim
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;
}
//autoeditácia príspevku (07 Dec 2016, 13:24)
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 ... )
Prílohy
Snímka.JPG
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8216
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C chyba v kode

Príspevok od používateľa harrison314 »

Dnes nemam cas sa s tym hrat.

Ale univerzalna rada v takychto pripadoch:
1, asserty - osetrit nodnoty ktore by nemali nastat,
2, pridaj si tam velke mnozsvo vypisov aby si vedel co tvoj program robi,
3, debugovat (napriklad cez GDB)
4, pozor na rozdiel medzi delenim celocislenych typov a s plavajucou desatinnou ciarkou
Napísať odpoveď