[Octave] Punkt Wspólny

Awatar użytkownika
piti-n
Użytkownik
Użytkownik
Posty: 534
Rejestracja: 24 gru 2010, o 22:42
Płeć: Mężczyzna
Lokalizacja: Wroclaw
Podziękował: 41 razy
Pomógł: 45 razy

[Octave] Punkt Wspólny

Post autor: piti-n »

Mam metodą bisekcji obliczyć punkt wspólny funkcji\(\displaystyle{ y=e^{x}}\) i \(\displaystyle{ y=3x}\). A wiec wybieram orzedział poczatkowy \(\displaystyle{ \left[1,2 \right]}\) i \(\displaystyle{ \delta =10^{-4}}\) i \(\displaystyle{ \epsilon=10^{-4}}\), Wynik to: 1.500000. Czy to na pewno dobry wynik bo sprawdzając z Wolfram alpha to już nie do końca, jednakże wiem że to może być spowodowane niedokładnością obliczeń, ale aż taką?

Kod: Zaznacz cały

function [r,v,it,err]= mbisekcji(f1,f2,a,b,delta,epsilon, M)
	u1=polyval(f1,a);
	v1=polyval(f1,b);
	u2=polyval(f2,a)+exp(a);
	v2=polyval(f2,b)+exp(b);
	printf("dane %e,%e,%e,%e
",u1,u2,v1,v2);
	e=b-a;
	if(((polyval(f1,a)>(polyval(f2,a)+exp(a)) && (polyval(f1,b)>polyval(f2,b)+exp(b))) || (polyval(f1,a)<(polyval(f2,a)+exp(a)) && polyval(f1,b)<(polyval(f2,b)+exp(b)))))
		printf "1 
"
		break;
	else
		printf "0
"
	endif
	for(k=1:M)
		e=e/2;
		c=a+e;
		w=polyval(f2,c);
		printf ("punkt=%e,   f(r):%e,   nr iteracji: %i,  a:%e,  b:%e 
", c,w,k,a,b);
		if(abs(e)<delta || abs(w)<epsilon)
			break;
		endif
		if(((polyval(f1,a)<(polyval(f2,a)+exp(a)) && (polyval(f1,b)>polyval(f2,b)+exp(b))) || (polyval(f1,a)>(polyval(f2,a)+exp(a)) && polyval(f1,b)<(polyval(f2,b)+exp(b)))))
			b=c;
			v=w;
		else
			a=c;
			u=w;
		endif
	endfor
endfunction	


f1=[3,0];
f2=[0];
a=1;
b=2;
delta=10^(-4);
epsilon=10^(-4);
M=100;

mbisekcji(f1,f2,a,b,delta,epsilon, M)
ODPOWIEDZ