Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Komentarz #8

Open
StachuraMichal opened this issue May 18, 2020 · 1 comment
Open

Komentarz #8

StachuraMichal opened this issue May 18, 2020 · 1 comment

Comments

@StachuraMichal
Copy link

StachuraMichal commented May 18, 2020

Na pierwszy rzut oka kod wyglądał dobrze. Wyjątek stanowi użycie niepotrzebnych zmiennych wskaźnikowych, przez co kod traci na czytelności, a rozdzielanie zmiennej i wskaźnika do niej może prowadzić do błędów.

Lab-4/main.cpp

Line 23 in 5406d23

double* t0_ = &t0, * tm_ = &tm, * y0_ = &y0, * l_ = &l; //wskazniki by latwiej wczytywac zmienne bez ciaglego copy-paste

Wszystko jednak rozbija się o formułę:

Lab-4/main.cpp

Lines 110 to 111 in 5406d23

rzade = round(log(fabs((ye - anali(y0, t, t0)))) / log(fabs((yee[k-1] - anali(y0, t, y0)))));
rzadrk = round(log(fabs((yr - anali(y0, t, t0)))) / log(fabs((yrr[k-1] - anali(y0, t, y0))))); //szacowanie rzędu zbieżności

co tu nie działa:

  1. rząd metody jest funkcją h i nie możemy oszacować go bez uwzględnienia tego jak zmieniało się h między iteracjami.
  2. yee[k-1] jest równe ye, gdyż w międzyczasie k zostało zwiększone o 1.
  3. funkcja anali jest wywoływana ze złymi argumentami
  4. zamiast porównywać dwa rozwiązania z różnym h porównuje się (gdyby pominąć pkt. 2) rozwiązania dla różnego t z tym samym h

jest to o tyle ciekawy przypadek, gdyż błąd 3 maskuje błąd 2, a błąd 2 ukrywa błąd 4.

Co w rezultacie prowadzi to do błędnych wniosków.

@EskutheOne
Copy link
Owner

EskutheOne commented May 18, 2020

#9 @StachuraMichal

Poprawione szacowanie rzędu zbieżności obu metod (teraz yee i ye oraz yrr i yr są porównywane dla różnych h):

Lab-4/main.cpp

Lines 107 to 117 in 673d213

if (j>0)
{
rzade = round(log(fabs((ye - anali(y0, t, t0)))) / log(fabs((yee[j-1] - anali(y0, t, t0)))));
rzadrk = round(log(fabs((yr - anali(y0, t, t0)))) / log(fabs((yrr[j-1] - anali(y0, t, t0))))); //szacowanie rzędu zbieżności
printf("\n RZAD ZBIEZONSCI E = %lf RZAD ZBIEZONOSCI RK = %lf \n\n", rzade, rzadrk);
}
yee[j] = ye;
yrr[j] = yr;

Usunąłem także zmienne wskaźnikowe i zamiast nich używam w funkcji scan od razu wskaźników

Lab-4/main.cpp

Line 52 in 673d213

scan(&l);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants