Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Аппроксимация числа пи на С#

41K
26 ноября 2008 года
ape1ron
5 / / 25.11.2008
Здраствуйте комрады, имеется такая задача:
Для числа пи известна формула пи/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.

Собственно код :
Цитата:
private void AppPI()
{
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 strpi1 = Convert.ToString(pi1);
string strpi = Convert.ToString(pi);


, но здесь я не могу понять как сделать необходимую мне вещь.
Помогите советом непросвещенному, заранее спс.

341
27 ноября 2008 года
Der Meister
874 / / 21.12.2007
Оно у тебя хранится в count
5
27 ноября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Der Meister
Оно у тебя хранится в count


Всеравно метод вычисления слишком неточный.
Вродебы был Ряд Ньютона для ПИ, нужно им пробовать.

14
27 ноября 2008 года
Phodopus
3.3K / / 19.06.2008
5-7 знаков после запятой это когда разница между сравниваемым и эталонным меньше 0,00001 - 0,0000001 соответственно.
Вот. Вроде ничего не напутал в цифрах. Если напутал - поправьте.
Помоему в коде это и делается. Или это не твой код?
41K
27 ноября 2008 года
ape1ron
5 / / 25.11.2008
Цитата: hardcase
Всеравно метод вычисления слишком неточный.
Вродебы был Ряд Ньютона для ПИ, нужно им пробовать.


Условием задачи является вычисление пи именно через разложение арктангенса в ряд Тейлора.

Цитата:
5-7 знаков после запятой это когда разница между сравниваемым и эталонным меньше 0,00001 - 0,0000001 соответственно


Угу, вы правы. Это я уже от безысходности всякую муть порол.

Сделал, работает. Идея как сделать во сне пришла :eek: Встал и сделал.
собственно код :

Цитата:
private void AppPI()
{
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

Всем спасибо)

341
28 ноября 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=Phodopus]5-7 знаков после запятой это когда разница между сравниваемым и эталонным меньше 0,00001 - 0,0000001 соответственно.
Вот. Вроде ничего не напутал в цифрах. Если напутал - поправьте.[/QUOTE]Кажется, всё же напутал. Метод итерационный (вроде так называется противоположность прямому?), и сходится к определённому значению. В общем случае, это значение можеть быть далеко от эталонного (напрямер, в связи с ошибками округления), но "точность до пяти знаков" означает, что с некоторой итерации пятый знак после запятой уже не может измениться - дальнейшие приращения к результату слишком малы. Так что, изначальный код топикстартера был верен и не нуждался в модификации.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог