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?
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
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
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;
}
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'));
}