Strona 1 z 1

[C++] Obliczanie wartości sin(x)

: 27 paź 2011, o 18:16
autor: mario765i
Witam! Mam do napisania program w c++, który wyznacza wartość \(\displaystyle{ \sin(x)}\) i porównuje ją z wartością \(\displaystyle{ \sin(x)}\) z biblioteki cmath. Dla małych wartości argumentu x wyniki są zbliżone, natomiast dla dużych wartości argumentu x - już znacznie się różnią. Jak poprawić program, aby dla dużych wartości argumentu x działał dokładniej? Proszę o pomoc. Oto mój kod (piszę w CodeBlocks):

Kod: Zaznacz cały

#include<iostream>
#include<cmath>
#include<iomanip>

using namespace std;

double my_sin(double x)
{
	double sum = 0.0, add, sign;

	const int iterations = 20;
	add = x;
	sum = add;
	sign = 1.0;
	for (int k=1; k<iterations; k++)
	{
		add = add*x*x/(2*k)/(2*k+1);
		sign = -sign;
		sum = sum+sign*add;
	}
	return sum;
}

int main()
{
	cout << "Porownanie funkcji my_sin z funkcja biblioteczna sin
";
	cout << "x	|	my_sin		|	sin		|	rel_err
";

	for (double x = 10.0; x <= 10+2*M_PI; x = x+0.05)
	{
		double yp  = my_sin(x);
		double y   = sin(x);
		double err = abs(y-yp)/abs(y);

		cout.precision(2);
		cout << fixed;
		cout << x  << "	|	";
		cout.precision(10);
		cout << yp << "	|	";
		cout << y  << "	|	";
		cout.precision(2);
		cout << scientific << err << "
";
	}
	return 0;
}

[C++] Obliczanie wartości sin(x)

: 27 paź 2011, o 18:32
autor: norwimaj
Pomyśl nad kolejnością sumowania. Co prawda w matematyce czystej dodawanie jest przemienne, ale w metodach numerycznych już tak nie jest.

[C++] Obliczanie wartości sin(x)

: 27 paź 2011, o 20:47
autor: abc666
mario765i, a nie możesz przed wykonaniem tych działań obliczyć policzyć x % 2*pi ?

[C++] Obliczanie wartości sin(x)

: 27 paź 2011, o 21:01
autor: Xitami
20 iteracji to nie jest zbyt wiele
a zmień warunek w pętli na "add!=0" lub "sum != sum+add"