background image

Proste metody numeryczne

Manipulacje ciągami i szeregami

a) Zdysretyzowaną krokiem T składową swobodną rozwiązania
macierzowego liniowego równania stanu jest funkcja macierzowa  exp(AT).
Jednym z  numerycznych przybliżeń tej funkcji jest jej rozwinięcie w szereg.
Błąd skończonego rozwinięcia można określić nierównością:

nq

p

e

nq

p

1

)

(

!

1

<

ε

gdzie:  n – wymiar A (dane); 
        (dane); p – integer;

Aby uzyskać pożądaną dokładność:

zadane

nq

p

e

nq

p

ε

ε

<

<

−1

)

(

!

1

czyli trzeba znależć p, które spełnia tę zależność. Jak?

background image

b) 
Kaczor wyskakuje z okręgu o promieniu 1; 

pierwszy skok od środka = 0.5 promienia (bo cienias); 

w każdym następnym o połowę mniej bo łajza puchnie; 

Po ilu skokach wyskoczy?. Oczywiście nigdy (dobrze mu tak). 

Ale dla jakiego p, minimalny skok jest mniejszy od zadanej wielkości, czyli:

zadane

p

s

<

2

1

background image

Ogólnie: jak  znaleźć  p ?

O ile w przypadku (b) można to znależć analitycznie to w przypadku (a) 
i wielu innych podobnych jest to niemożliwe. 
Numerycznie można zaproponować algorytm, który z wszystkimi 
podobnymi przypadkami ( f(p) < e ) poradzi sobie iteracyjnie. Ale funkcja
f(p) musi być monotoniczna.

p = 1

f(p) < e, ?

p = p+1

Tak

Nie

p

background image

Program skokin.c pokazuje obliczenia iteracyjne 
(najważniejszy sposób obliczeń numerycznych)

#include <stdio.h>
int  main()
{
  double  minskok,skok1,skok,od1;
  long int nrskok;  int  zn;
  printf("************** Skoki **************\n");
  do
  {
    printf("\n minimalny skok    : "); scanf("%lf",&minskok);
    nrskok=1;  skok1=2;  od1=0;
    do
    {   skok=1/skok1;   skok1=skok1*2;  od1=od1+skok;
        printf("\n numer skoku       ");  printf("%ld",nrskok);
        printf("    odleglosc,skok    ");  printf("%e %e",od1,skok);
        nrskok++;  }
    while (skok>=minskok);
    printf("\n\n\n Czy chcesz jeszcze liczyc Tak = 1, Nie = 0  :  ");
    scanf ("%d", &zn);
  } while (zn==1);
  return 0;
}

background image

Program z grafiką, 
dźwiękiem 
i  opóźnieniem obliczeń.
Dla Turbo C.

#include <stdio.h>
#include <conio.h>
void  main()
{
     double  minskok,skok1,skok,od1; long int nrskok,i; char    zn;
     window(1,1,80,25); textcolor(YELLOW); textbackground(RED); clrscr();
     gotoxy(25,1); printf("************** Skoki **************");
     do
        {
          window(1,2,80,24); textcolor(GREEN); textbackground(0); clrscr();
          gotoxy(10,5); printf("minimalny skok    : "); scanf("%lf",&minskok);
          gotoxy(10,10); printf("numer skoku       ");
          gotoxy(10,12); printf("odleglosc,skok    ");
          nrskok=1;    skok1=2;    od1=0;
         do
                {
                 skok=1/skok1;  skok1=skok1*2; od1=od1+skok;
                 gotoxy(26,10); printf("%ld",nrskok);
                 gotoxy(25,12); printf("%e %e",od1,skok);
                 nrskok++;
                sound(200+nrskok*10); delay(100000); nosound();
                for (i=0; i<10000000; i++) i = i + 1 -1;
                 } while (skok>=minskok);
        gotoxy(10,17); printf("Czy chcesz jeszcze liczyc T/N");
       zn=getch();
       } while ((zn!='n') && (zn!='N'));
}