Brook Taylor
|
Ariketa hau egiteko, ikusitako hauek gogoratu Azp-1 (zero bertsioa), Azp-2 (zero bertsioa) eta Azp-3 (zero bertsioa). Klikatu irudi honen gainean eta grafikoki ikusiko duzu Taylor polinomioa kosinu funtzioarentzat:
Lehen bertsioa
Angelu baten kosinua Taylor-ren arabera honela kalkula daiteke: Non x radianetan emaniko angelua den. |
Programa bat idatzi kosinua kalkulatuko duena aurreko segidaren N batugai erabiliz. Batugaien N kopurua ez da ezaguna, batugaiak aintzat hartuko dira azken batugaiaren balio absolutua 0.00001 baino txikiagoa izan arte adibidez (doikuntza hori teklatuaren bitartez emango du programaren erabiltzaileak).
Kasu honetan batukaria kalkulatzen duen azpiprogramak emaitza bakarra itzuli behar duelako funtzio baten bitartez programatuko dugu. Diogunez, azpiprograma hori funtzio bat izango da bere goiburukoa hauxe delarik:
function fnrKosinuaKalkulatu(rX, rDoikuntza: real): real ;
Sarrera: rX radianak (teklatuz irakurritako rAngelua graduak radianetara igarota)
Sarrera: rDoikuntza (gogoratu bertsio honetan doikuntza programa nagusian irakurtzen dela)
Programaren...
TaylorFuntzioz1.pas
...lehen hurbilketa honek x sarrerako angelua 0 eta Π/2 artekoa izan dadila. Gero, programa ongi dabilenean kodifikazioa aberastu edozein koadranteko angelurako, hau da sarrerako x angelua 0 eta 2Π artekoa izan daitekeela. Amaitzeko, programa osatu edozein angelurako, hots, sarrerako x angelua 2Π baino handiagoa denean ere, laguntza hemen.
Bigarren bertsioa
Demagun orain bigarren bertsio honetan bi aldaketa egingo ditugula. Batetik doikuntza konstante batekin lan egingo dugula, eta bestetik programa nagusiak beste emaitza bat agertu behar duela ere (iterazioen kopurua). Beraz, kosinua kalkulatzeko metodo bera erabiliko dugu baina azpiprogramak itzuli beharko dituen emaitzak bi izango dira:
- kosinuaren balioa eta horrez gain
- zenbat iteraziotan lortu den kalkulatzea
Gogoratu angelu baten kosinua Taylor-ren arabera honela kalkula daiteke: Non x radianetan emaniko angelua den. |
Programa bat idatzi kosinua kalkulatuko duena aurreko segidaren N batugai erabiliz. Batugaien N kopurua ez da ezaguna, batugaiak aintzat hartuko dira azken batugaiaren balio absolutu konstantea 0.00001 baino txikiagoa izan arte.
Kkasu honetan batukaria kalkulatzen duen azpiprogramak bi emaitza itzuli behar dituelako ezingo da funtzio baten bitartez programatuko. Azpiprograma hori prozedura bat izango da eta bere goiburukoa honelakoxea izango da:
procedure KosinuaKalkulatu(rX: real; var iKont: integer; var rEmaitza: real) ;
Sarrera: rX angelua radianetan (gogoratu bertsio honetan doikuntza konstante bat dela)
Irteera: iKont iterazioen kopurua
Irteera: rEmaitza kosinuaren kalkulua
Programaren...
TaylorProzeduraFuntzioak.pas
...bigarren bertsio honek x sarrerako angelua 0 eta Π/2 artekoa izan dadila. Gero, programa ongi dabilenean kodifikazioa aberastu edozein koadranteko angelurako, hau da sarrerako x angelua 0 eta 2Π artekoa izan daitekeela. Amaitzeko, programa osatu edozein angelurako, hots, sarrerako x angelua 2Π baino handiagoa denean ere, laguntza hemen.
Doikuntza konstante bat izanik:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | { Faktorialaren emaitza longint datu-motakoa da } program KosinuaTaylorBitartez_LehenKoadrantea; uses crt; const rDOITASUNA = 0.0009 ; (* kalkuluaren prezisioa, bederatzi hamarmilaren *) function fnliFaktoriala(iZbk: integer ): longint ; var j: integer ; liMetatua: longint ; begin liMetatua := 1 ; for j:= 1 to iZbk do begin liMetatua := liMetatua*j; //writeln('j=', j, ' ---faktoriala-> ', liMetatua); (* agindu hau indarrean jarri programa ulertzeko *) end ; fnliFaktoriala := liMetatua; end ; function fnrBerreketa(rX: real ; iZbk: integer ): real ; var k: integer ; rMetatua: real ; begin rMetatua := 1 ; for k:= 1 to iZbk do begin rMetatua := rMetatua*rX; //writeln('k=', k, ' ===berredura==> ', rMetatua:0:5); (* agindu hau indarrean jarri programa ulertzeko *) end ; fnrBerreketa := rMetatua; end ; function fnrKosinuaKalkulatu(rX: real ): real ; var rKosinua, rBerrek, rBatugaia: real ; iZeinua, iKont: integer ; liFakt: longint ; begin rKosinua := 1.0 ; (* lehen iterazioa kanpoan *) iZeinua := - 1 ; iKont := 2 ; //writeln('Hasi-hasieran... rKosinua = ':18, rKosinua:0:10); (* agindu hau indarrean jarri programa ulertzeko *) //writeln; (* agindu hau indarrean jarri programa ulertzeko *) repeat liFakt := fnliFaktoriala(iKont); rBerrek := fnrBerreketa(rX, iKont); rBatugaia := iZeinua*rBerrek/liFakt; rKosinua := rKosinua + rBatugaia; //writeln('rBatugaia = ', rBatugaia:13:10, 'rKosinua = ':22, rKosinua:0:10); (* agindu hau indarrean jarri programa ulertzeko *) //writeln('DOITASUNA = ', rDOITASUNA:13:10); (* agindu hau indarrean jarri programa ulertzeko *) //writeln; (* agindu hau indarrean jarri programa ulertzeko *) iZeinua := iZeinua*(- 1 ); iKont := iKont + 2 ; until abs (rBatugaia) < rDOITASUNA; fnrKosinuaKalkulatu := rKosinua; end ; (* -------------------------PROGRAMA NAGUSIA--------------------------- *) var rGraduak: real ; (* angelua graduetan *) rX: real ; (* angelua radianetan *) rKos: real ; begin clrscr; repeat write ( 'Lehenengo koadranteko angelu bat eman gradutan: ' ); readln(rGraduak); if (rGraduak < 0.0 ) or (rGraduak >= 90.0 ) then writeln ( 'Angelua 0.0 eta 89.999 artekoa izan dadila' ); until (rGraduak >= 0.0 ) and (rGraduak < 90.0 ); rX := rGraduak* 2 *PI/ 360 ; writeln (rGraduak: 0 : 3 , ' gradu = ' , rX: 0 : 5 , ' radian' ); writeln ; rKos := fnrKosinuaKalkulatu(rX); writeln ( 'kos(' , rX: 0 : 3 , ') = ' , rKos: 0 : 10 ); writeln ( 'cos(' , rX: 0 : 3 , ') = ' , cos(rX): 0 : 10 ); writeln ; writeln ( '==============================' ); writeln ( 'Edozein tekla sakatu amaitzeko' ); writeln ( '==============================' ); repeat until keypressed; end . |
iruzkinik ez:
Argitaratu iruzkina