Аппроксимация числа пи на С#
Для числа пи известна формула пи/4=4*(arctan(1/5)-arctan(1/239)). Ряд тейлора для арктангенса y=x-x^3/3+x^5/5-x^7/7.... Ряд достаточно быстро сходиться для |х|<1/2. Сколько надо взять членов в ряде чтобы вычислить пи с точность в 5-7 знаков после запятой. Результат сравнить с Math.PI.
Собственно код :
{
double pi = Math.PI;
double pi1 = 4 * (4 * ArcTAN(0.2) - ArcTAN(1.0/239.0));
string strpi1 = Convert.ToString(pi1);
string strpi = Convert.ToString(pi);
int count = 0;
label3.Text = Convert.ToString(pi) + "\n" + Convert.ToString(pi1)+ "\n" +Convert.ToString(count);
}
private double ArcTAN(double n) // функция вычисления числа арктнегса
{double Fx = 0, Fxold = 0, PoxX = n;
long i = 1;
int minus = 1;
double Eps = 0.000001;
int count = 0;
do
{
Fxold = Fx;
Fx += minus * PoxX / i;
PoxX *= n * n;
i += 2;
minus *= -1;
count++;
}
while (Fx-Fxold>=Eps);
return Fx;
}
Ну и вопрос. Я не могу понять, как мне организовать чтобы количество итераций было необходимым для вычисления с заданной точностью. В похожей задача с експонентой я тупо анализировал символы с string переменных и искал необходимую точность
для этого и:
string strpi = Convert.ToString(pi);
, но здесь я не могу понять как сделать необходимую мне вещь.
Помогите советом непросвещенному, заранее спс.
Всеравно метод вычисления слишком неточный.
Вродебы был Ряд Ньютона для ПИ, нужно им пробовать.
Вот. Вроде ничего не напутал в цифрах. Если напутал - поправьте.
Помоему в коде это и делается. Или это не твой код?
Вродебы был Ряд Ньютона для ПИ, нужно им пробовать.
Условием задачи является вычисление пи именно через разложение арктангенса в ряд Тейлора.
Угу, вы правы. Это я уже от безысходности всякую муть порол.
Сделал, работает. Идея как сделать во сне пришла :eek: Встал и сделал.
собственно код :
{
double pi;
char[] digitsPIT4; // объявление массива
digitsPIT4 = new char[7]; // создаем char массив для запоминания
//значение первых семи цифр после запятой в числе ПИ
digitsPIT4[1] = Convert.ToChar(1); digitsPIT4[2] = Convert.ToChar(4); digitsPIT4[3] = Convert.ToChar(1);
digitsPIT4[4] = Convert.ToChar(5); digitsPIT4[5] = Convert.ToChar(9); digitsPIT4[6] = Convert.ToChar(2);
digitsPIT4[8] = Convert.ToChar(6);
int i=1;
int j=3;
int inter=1;
do
{
pi = 16 * ArcTAN(0.2, inter) - 4 * ArcTAN(1.0 / 239.0, inter);
if (digitsPIT4 == Convert.ToString(pi)[j])
{
j++;
}
else
{
inter++;
}
i++;
}
while (i != 7);
label3.Text = Convert.ToString(Math.PI) + "\n" + Convert.ToString(pi) + "\n" + "количество интераций = " + Convert.ToString(inter-1);
}
private double ArcTAN(double n,int countINT) //функция вычисления арктангенса
{
double Fx = 0, Fxold = 0, PoxX = n;
int i = 1;
int minus = 1;
int count;
for (count = 1; count <= countINT; count++)
{
Fxold = Fx;
Fx += minus * PoxX / i;
PoxX *= n * n;
i += 2;
minus *= -1;
}
return Fx;
}
Пусть он довольно неэргономично использует ресурсы(все эти преобразования). Но вопрос об этом не стоял :D
Всем спасибо)
Вот. Вроде ничего не напутал в цифрах. Если напутал - поправьте.[/QUOTE]Кажется, всё же напутал. Метод итерационный (вроде так называется противоположность прямому?), и сходится к определённому значению. В общем случае, это значение можеть быть далеко от эталонного (напрямер, в связи с ошибками округления), но "точность до пяти знаков" означает, что с некоторой итерации пятый знак после запятой уже не может измениться - дальнейшие приращения к результату слишком малы. Так что, изначальный код топикстартера был верен и не нуждался в модификации.