[Algorytmy] Wyznaczenie wartości sinusa

angel10
Użytkownik
Użytkownik
Posty: 47
Rejestracja: 22 wrz 2008, o 17:17
Płeć: Mężczyzna
Podziękował: 8 razy

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: angel10 »

Oblicz przybliżoną wartość funkcji sinus dla kąta \(\displaystyle{ x _{r}}\) podanego w radianach jako liczba rzeczywista. Przybliżenie
wartości funkcji wyznacz na podstawie jej rozwinięcia w szereg potęgowy:
\(\displaystyle{ \sin(x _{r} )= \frac{x _{r} }{1} - \frac{x ^{3} _{r} }{3!} +\frac{x ^{5} _{r} }{5!} -...=w _{1}+w _{2}+w _{3}+...}\)
Iteracje są kontynuowane dopóki wyraz wi szeregu jest większy od zadanej dokładności \(\displaystyle{ eps}\). Skorzystaj z faktu, że:

\(\displaystyle{ w _{i} = \begin{cases} x _{r} \ , \ dla \ i=1 \\ -1 \cdot w _{i-1} \cdot \frac{ x^{2} _{r} }{(2i-2)(2i-1)} \ , \ dla \ i > 1 \end{cases}}\)
No i problem mój polega na tym, że nie wiem, od której strony się za to zabrać. Nie wiem, czym jest tak właściwie to \(\displaystyle{ eps}\), nie wiem ile razy ma wykonać się moja pętla itd.
Ostatnio zmieniony 19 paź 2013, o 18:19 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: vpprof »

Wszystko jest napisane w treści zadania, tak się przyjęło że przez \(\displaystyle{ \epsilon}\) oznacza się otoczenie punktu (widziałeś na pewno przy definicji granicy szeregu) a stąd symbol ten przewędrował do informatyki (np. w bibliotece standardowej C są zdefiniowane stałe FLT_EPSILON i DBL_EPSILON oznaczające dokładność poszczególnych typów danych w arytmetyce zmiennopozycyjnej). Z tym że to jest kompletnie nieważne, potraktuj to jak zwyczajną zmienną, którą porównujesz z \(\displaystyle{ w_i}\).

Jak się zabrać do tego:
  1. Wynik:=0
  2. \(\displaystyle{ i:=1}\)
  3. Wyznaczyć \(\displaystyle{ w_i}\)
  4. Dodać \(\displaystyle{ w_i}\) do wyniku
  5. Jeśli \(\displaystyle{ w_i \le eps}\) to koniec, jeśli nie to \(\displaystyle{ i:=i+1}\) i do punktu 3
-- 18 paź 2013, o 15:08 --Szybciej nawet będzie wykonywał się program, w którym na początku dasz Wynik:=xr, żebyś przy ustalaniu \(\displaystyle{ w_i}\) nie musiał każdorazowo sprawdzać czy \(\displaystyle{ i=1}\) bo to bez sensu.
davee
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 20 paź 2013, o 18:07
Płeć: Mężczyzna
Lokalizacja: Gda

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: davee »

Witam!
Czy mógłby ktoś sprawdzić czy podany program spełnia wymagania z wyżej wymienionego zadania:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
using namespace std;
main ()
{
long double x,eps,wynik,w1;
int i;
i=1;
eps=1e-8;
cout.precision(10);
cout << "Program oblicza wartosc funkcji sinus" << endl;
do
{
cout << "Podaj wartosc kata x [wyrazone w radianach]: ";
cin >> x;
if (x!=1)
{

w1=x;
wynik=sin((-1)*w1*(x*x))/((2*i-2)*(2*i-1));
i=i+1;
cout << "Wartosc sinusa kata x[w radianach] " << x << " wysosi: "<< sin(x) << endl;
}
else
cout << "Wartosc sinusa kata x[w radianach] " << x << " wysosi: "<< x << endl;
}while (wynik<eps);

system ("PAUSE");
return 0;
}
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: vpprof »

Po pierwsze, będzie za każdym kolejnym przybliżeniem pytał na nowo o wprowadzenie kąta. Po drugie, to nie wynik ma być mniejszy od epsilona, tylko dany wyraz szeregu \(\displaystyle{ w_i}\) — wtedy wiemy, że już nie musimy liczyć, bo następne wyrazy są coraz mniejsze i i tak zostaną zaniedbane (bo są poza naszą dokładnością).-- 20 paź 2013, o 18:31 --Po trzecie, masz obliczać kolejne wyrazy szeregu, dopóki one NIE SĄ mniejsze od epsilon, a ty wpisałeś coś przeciwnego w while. Tak jak napisałeś, pętla wykonałaby się zawsze raz tylko.

No i poza tym stosuj „profesjonalną” notację C czyli zamiast takich brzydko wyglądających i=i+1i++ albo ++i zależnie od kontekstu.
davee
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 20 paź 2013, o 18:07
Płeć: Mężczyzna
Lokalizacja: Gda

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: davee »

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
using namespace std;
main ()
{
long double x,eps,wynik,w1;
int i;
i=1;
eps=1e-8;
cout.precision(10);
cout << "Program oblicza wartosc funkcji sinus" << endl;
do
{
cout << "Podaj wartosc kata x [wyrazone w radianach]: ";
cin >> x;
if (x>1)
{
w1=sin(x);
wynik=sin((-1)*w1*(x*x))/((2*i-2)*(2*i-1));
i++;
cout << "Wartosc sinusa kata x[w radianach] " << x << " wysosi: "<< wynik << endl;
}
else if (x<1)
cout << "Niepoprawna wartosc x" << endl;
else
cout << "Wartosc sinusa kata x[w radianach] " << x << " wysosi: "<< x << endl;
}while (wynik>=eps);

system ("PAUSE");
return 0;
}
Dobra mam coś takiego, nie do końca wiem jak określić na początku wyraz w1 (jaką przypisać mu wartość początkową). Dlatego na razie nie zmieniam w definicji while tego "wynik". Jakaś sugestia?
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: vpprof »

Znów dla każdego wyrazu szeregu program będzie pytał o podanie nowego kąta.
davee pisze:nie do końca wiem jak określić na początku wyraz w1 (jaką przypisać mu wartość początkową). Dlatego na razie nie zmieniam w definicji while tego "wynik". Jakaś sugestia?
Po wykonaniu pętli wyraz w1 będzie miał wartość, więc nie ma problemu. Warunek jest sprawdzany wtedy, jak się do niego dojdzie, to nie jest tak, że po słowie do program skacze od razu na koniec pętli — do tego służy pętla while a nie do…while.-- 20 paź 2013, o 22:54 --Poza tym teraz zauważyłem, że nie korzystasz ze wzorów z treści zadania, tylko stosujesz funkcję biblioteczną sin(), to wtedy nie rozumiem jaki ma sens pisanie tego całego programu, można to wszystko załatwić trzema linijkami kodu.
hanyshanys
Użytkownik
Użytkownik
Posty: 1
Rejestracja: 18 paź 2014, o 15:01
Płeć: Mężczyzna
Lokalizacja: gdansk

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: hanyshanys »

Witam, mam problem z dokładnie tym samym zadaniem mój kod wygląda tak:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{

double x;
double eps;
double w = 1;
double suma;

cout << "Podaj kat x" << endl;
cin >> x;
cout << "Podaj dokladnosc okreslnie funkcji eps w notacji wykladniczej" << endl;
cin >> eps;

for (int i = 0; w>eps; i++){
if(i==1){
w=x;
} else

w = (-1)*w*x*x/((2*i-1)*(2*i-2));
suma = suma + w;

}

cout << "Wartosc sin wedlug podstawowej funkcji: " << setprecision(10) << sin(x) << " a w przyblizeniu do eps: " << setprecision(10) << sin(suma) << endl;

system("Pause");
return (0);
}
program kompiluje się ale wartosci sinusa przyblizonego są z kosmosu i nie mam pojęcia dlaczego
Awatar użytkownika
vpprof
Użytkownik
Użytkownik
Posty: 492
Rejestracja: 11 paź 2012, o 11:20
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 26 razy
Pomógł: 64 razy

[Algorytmy] Wyznaczenie wartości sinusa

Post autor: vpprof »

A jaką wartość początkową przypisujesz zmiennej suma?

PS. Stosuj

Kod: Zaznacz cały

 zamiast [quote].
ODPOWIEDZ