Mam taki problem, że nie działa mi metoda siecznych. Myslałem z początku że błąd implementacyjny ale jak sobie liczę na kolanie to też nie działa.
Moje zadanie. Jaką nadać prędkość ciału \(\displaystyle{ Vx, Vy}\) by trafiło z punktu \(\displaystyle{ x0=0,y0=0}\) do punktu \(\displaystyle{ xk=20,yk=0}\) przy czym tangens kąta między składowymi początkowymi wektora prędkości to 45 stopni. No więc tak obieram sobie najpierw \(\displaystyle{ Vx=5,Vy=5}\) i rozwiązuję metodą Rungego Kutty do momentu aż \(\displaystyle{ yk=0}\). Zasięg rzutu \(\displaystyle{ xk = 15.55}\). Potem obieram \(\displaystyle{ Vx=15,Vy=15}\). Zasięg rzutu \(\displaystyle{ xk = 49.066}\) przy czym liczba iteracji może być inna ze względu na to że kończę obliczenia jak \(\displaystyle{ yk=0}\).
No więc mam 2 wyniki, jeden przed wartością oczekiwaną, drugi po, więc mogę zastosować metodę siecznych.
s1 - długość wektora z iteracji 1
s2 - długość wektora z iteracji 2
\(\displaystyle{ E2 = s2 - 20}\)
\(\displaystyle{ E1 = s1 - 20}\)
\(\displaystyle{ s3 = s2 - E2*(s1-s2)/(E1-E2)}\)
i wychodzi że w iteracji 3 mam wziąć \(\displaystyle{ Vx=Vy=14.14}\), czyli wektor o długości s3=20. Wynik zasięgu rzutu to \(\displaystyle{ xk=46.2}\).Do metody siecznych daję s2 i s3 i zwraca mi s4 znowu równy 20.
Ale w ogólę olejmy nawet tą powyższą treść. Cokolwiek nie dam do powyższej metody siecznych to zwraca mi 20. Co jest nie tak?
Tu kod w matlabie:
Kod: Zaznacz cały
function mysecant(s1, s2, exp_res)
Es2 = s2 - exp_res;
Es1 = s1 - exp_res;
s3 = s2 - Es2*(s1-s2)/(Es1-Es2);
disp(strcat('Next attemp should be at s = ',num2str(s3)));
disp(strcat('Es = ',num2str(Es2)));
return;