Aproximace sinu/kosinu polygonem – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Aproximace sinu/kosinu polygonem – Pascal – Fórum – Programujte.comAproximace sinu/kosinu polygonem – Pascal – Fórum – Programujte.com

 

packal
~ Anonymní uživatel
12 příspěvků
18. 1. 2015   #1
-
0
-

Zdravim, mel bych takovy dotaz, doufam, ze jiz neni v nejakem vlaknu zodpovezen. Jsem tak trochu v koncich, je to zakladni ukol na programko a ja to nejak nedavam... Potrebuji aproximovat radu (v priloze), ve ktere se vyskytuji goniometricke funkce, ale nesmim vyuzit funkci sinus/kosinus ci vnorene cykly. Jen scitani, nasobeni, deleni, souctove vzorce. Rady se kresli pro ruzna n (napr. 3, 10, 42). Puvodne jsem zkousel zohybat paraboly a napojit je na sebe, to vedlo k mnoha promarnenym hodinam (: Pak jsem klasicky sahl po aproximaci Taylorem, ktery se take ukazal jako neefektivni, protoze pro velka n bohuzel utika, musel by byt moc vysokych radu. Rada je pouzit de facto souctove vzorce (sin(a+b)=...) pac argumenty rostou aritmetickou radou. Umim udelat "polygonalni kruznici" (viz. nize), ale tim bohuzel koncim. Pokud ji uzitim IF klauzule rozdelim na ctvrtky, tak jde pospojovat do neceho jako sinus/kosinus, ale je to dosti neohrabane a hlavne to neni funkce, je to vypis tabelovanych hodnot. Kazdopadne nejak takhle by se na to asi melo jiti. Nemohl by me prosim nekdo trochu nasmerovat? Vim, ze to neni uplne programovaci task jako spise matematicky, ale ja jsem spatny matematik a jeste mnohem horsi programator, takze to zkousim tady. Diky moc za jakekoli podnetne rady!

program pol_kruz;

const N = 1000;
      uhel = 2*Pi/N;
var cos_u,sin_u : real;
    cosf, sinf  : real;
             i  : integer;
    new_cosf    : real;

begin
  cos_u := cos(uhel);
  sin_u := sin(uhel);

  cosf := 1;
  sinf := 0;

  for i:= 0 to N do begin

    writeln(cosf:9:3, ' ', sinf:9:3);

    new_cosf := cosf*cos_u-sinf*sin_u;
    sinf := cosf*sin_u+sinf*cos_u;
    cosf := new_cosf;
  end;

  readln;

end.

Nahlásit jako SPAM
IP: 62.245.94.–
packal
~ Anonymní uživatel
12 příspěvků
Nahlásit jako SPAM
IP: 62.245.94.–
q
~ Anonymní uživatel
219 příspěvků
18. 1. 2015   #3
-
0
-

Nechápu ten problém s Taylorem. Stačí ti přece ta jedna vlna a to, že to potom utíká ničemu nevadí.

Nahlásit jako SPAM
IP: 213.211.51.–
packal
~ Anonymní uživatel
12 příspěvků
18. 1. 2015   #4
-
0
-

#3 q
Hodnoty maji byt mezi -4..4, Taylor udela pekne jen jednu vlnu tehle rady a to pro n=1 (myslim nejaky rozumny, 9 radu). Ta zelena rada na obrazku je pro n=33, tam je to myslim na uz uplne nerealne. Teoreticky mi to prislo ok, ale po prakticke strance to je neuspokojive reseni (muzu ho sem hodit), kazdopadne jak pisi, nejsem zadny programator, takze by se urcite dalo poladit. Jinak predpokladam, ze by mi reseni pomoci Taylora stejne vratil...

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 62.245.94.–
q
~ Anonymní uživatel
219 příspěvků
18. 1. 2015   #5
-
0
-

Myslel jsem to tak, že stačí Taylor jen takového stupně, abys pokryl jednu vlnu (případně i půlvlnu) od -π do +π s tím, že pak už se pořád opakuje.

Ale teď jsem to zkoušel a je to na prd.

Nahlásit jako SPAM
IP: 213.211.51.–
packal
~ Anonymní uživatel
12 příspěvků
18. 1. 2015   #6
-
0
-

souhlas a hlavne to neni cesta, kterou bych mel postupovat... trochu me to desi, protoze to je 2. nejlehci ukol co tam mame (pry) a ja kvuli tomu uz po druhe odlozil zkousku (:

Nahlásit jako SPAM
IP: 62.245.94.–
peter
~ Anonymní uživatel
4016 příspěvků
19. 1. 2015   #7
-
0
-

Nevim, jestli ti to pomuze, ale ja potreboval nedavno celou funkci pro php pro rychly kosinus. Fakt je to celkem cool, ale musel jsem si to prizpusobit pro vetsi uhly. Jenze ty to nejspis mas spocitat.
Ten sinus, kosinus se prave pocita z toho, ze urcitem intervalu je ten polynom skoro stejny jako sin, kosinus.
Je to vlastne furrierova transformace za pouziti polynomu misto sinu a cosinu. To ti mozna nic nerika :) Ta spocita v tom, ze scitanim a odcitanim sinu a cosinu do nekonecna je mozne vytvorit jakoukoliv nevracejici se krivku v uzavrenem intervalu. Urcite znas pak vysledek, pouzivat to kazdy digitalni obrazek a film, jpeg, mpeg, mp3, ogg...

// http://lab.polygonal.de/?…
function fastCos($x)
{
$x += 4.71238898; // $x += M_PI + pp(M_PI/2);
while ($x > 3.14159265)
	{
    $x -= 6.28318531;
}

if ($x < 0)
{
    $x = 1.27323954 * $x + 0.405284735 * $x * $x;
    if ($x < 0)
        return .225 * ($x *-$x - $x) + $x;
    else
        return .225 * ($x * $x - $x) + $x;
}
else
{
    $x = 1.27323954 * $x - 0.405284735 * $x * $x;
    if ($x < 0)
        return .225 * ($x *-$x - $x) + $x;
    else
        return .225 * ($x * $x - $x) + $x;
}
}

function fastCos($x)
{
$x += 4.71238898; // $x += M_PI + pp(M_PI/2);
while ($x > 3.14159265)
	{
    $x -= 6.28318531;
}
$xx = ($x < 0) ? $x * $x : -$x * $x;
$x = 1.27323954 * $x + 0.405284735 * $xx;
$xx = ($x < 0) ? -$x * $x : $x * $x;
return .225 * ($xx - $x) + $x;
}

function fastCos($x)
{
$x += 4.71238898; // $x += M_PI + pp(M_PI/2);
while ($x > 3.14159265)
	{
    $x -= 6.28318531;
}
return ($x < 0) ? 1.27323954 * $x + 0.405284735 * $x * $x : 1.27323954 * $x - 0.405284735 * $x * $x;
}
Nahlásit jako SPAM
IP: 2001:718:2601:1f7:204b:51...–
packal
~ Anonymní uživatel
12 příspěvků
19. 1. 2015   #8
-
0
-

Dekuji za prispevek, na tuto aproximaci jsem pred casem take narazil, Fourrierovu transformaci samozrejme znam. Mozna zkusim vyuzit, kdyz se nikomu nepodari poradit elegantnejsi zpusob reseni pomoci souctovych vzorcu. Jen se obavam, ze to bude mit stejne uskali jako me reseni s pomoci Taylorova polynomu.

Nahlásit jako SPAM
IP: 212.27.195.–
Mircosoft+1
Věrný člen
20. 1. 2015   #9
-
0
-

Sinusovou půlvlnu na intervalu 0..pí/2 celkem slušně (s max. chybou cca 0.06) aproximuje parabola y=1-(4/pi^2)*(x-pi/2)^2. Periodická vlnovka se z ní udělá pomocí pár podmínek a otočených znamének (viz třeba funkci RychlySin v jednotce http://mircosoft.mzf.cz/…ad/NFSUP.PAS - ta je založená na tabulce, ale výchozí rozsah používá stejný).

Součtové vzorce asi ani nemá smysl zkoušet, vždycky jsem se dostal ke složitějším výrazům, než se kterými jsem začínal, a goniometrické funkce v nich byly pořád.

Jestli dobře chápu pana Taylora, tak ta jeho aproximace spolehlivě funguje jenom v okolí nějakého pevně daného bodu, kde si můžeme předpočítat hodnoty derivací a pak už jenom násobit, dělit a sčítat. Aproximovat s ním funkci na libovolném rozsahu ale nejde a derivováním se sinu a cosinu stejně nezbavíme, takže bych to tímhle směrem asi taky nezkoušel.

Hodně štěstí...

Nahlásit jako SPAM
IP: 212.79.106.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
packal
~ Anonymní uživatel
12 příspěvků
21. 1. 2015   #10
-
0
-

Dekuji za koment, jak jsem psal, parabola me napadla puvodne jako autorske reseni, jen se mi to nejak nepodarilo uvest do praxe (narazil jsem na sve "programatorske" limity :) Zkusim se inspirovat, jinak pekny material na Tvych strankach... 

Nahlásit jako SPAM
IP: 212.27.195.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Aproximace plochy — založil MathMan

Aproximace - Diferenciál — založil djanosik

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý