Консультация № 176448
03.02.2010, 02:01
0.00 руб.
0 6 2
Здравствуйте, эксперты. Помогите написать метод вычисления функции:

Обсуждение

давно
Специалист
246813
155
03.02.2010, 10:34
общий
Xbondx:
Уточните пожалуйста ограничения n и x.
Неизвестный
03.02.2010, 12:24
общий
Ограничений нету
Неизвестный
03.02.2010, 13:02
общий
Извините, написал в Паскале, невнимателен был. Сейчас исправлюсь
давно
Академик
320937
2216
03.02.2010, 13:16
общий
Xbondx:
Добрый день! Подобные вопросы уже задавались. Обращаю Ваше внимание, например, на 172489 и
175024.
В Вашей задаче
Код:

a[0]=x
a[n]=(-1)^x*x^(2n+1)/(2n+1)!
a[n-1]=(-1)^(x-1)*x^(2n-1)/(2n-1)!
a[n]/a[n-1]=-x^2/((2n)(2n+1))

Приходим к рекуррентной формуле
a=x, n=0
a=-a*x*x/(2*n)/(2*n+1), n>0


Неизвестный
03.02.2010, 15:59
общий
это ответ
Здравствуйте, Xbondx.
В приложении код программы, решающей Вашу задачу. Сделал в VC 2008.
Если в чём другом нужно было, то:
а) нужно было писать;
б) сделаем .

Приложение:
// 176488a.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
// Для пи, чтоб не вычислять
#define _USE_MATH_DEFINES
#include <math.h>
#include <conio.h>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
locale::global(locale("russian_russia.866"));

double eps = 0; // Задаем максимальную точность
double MySin, element, x, tol, pi2;
int n = 1;

// Вычисление машинной точности - точности представления вещественных чисел в памяти
// Это максимально достижимая точность
tol = 1;
while ( tol + 1.0 > 1.0) tol /=2;
tol = tol * 2 + eps;


pi2 = M_PI/2;
x = pi2+12;
wprintf(L"Точное значение = %20.18g \n", sin(x));
// Используем формулы приведения. Поскольку пи приближенно задается
// нужно именно так, а не возможным делением
while (abs(x) > M_PI*n) n++;
x = x - M_PI*(n-1);
if (n % 2 == 0) x = -x; // Проверка не четность

MySin = x;
element = x;
n = 0;
do {
n++;
element = - element*x*x/(2*n*(2*n + 1));
MySin += element;
} while (abs(element) > tol);
//n /= 2;
wprintf(L"Рассчитанное значение = %20.18g \n", MySin);
wprintf(L"Количество элементов ряда %d \n", n);

_getch();
return 0;
}

4
Неизвестный
03.02.2010, 20:51
общий
это ответ
Здравствуйте, Xbondx.
Программа. С++. Компилировал GCC.
Код:
#include <iostream>
#include <locale>
#include <limits>
#include <valarray>
#include <cmath>

using namespace std;

// Вычисляет синус
double msin(double x)
{
// Приводим к -π/2..π/2
// Для наших скромных нужд хватит и такого приведения
int n=floor(abs(x)/M_PI);
x-=(x<0?-1:1)*n*M_PI;
x=n&1?-x:x;
if(abs(x)>M_PI_2)
{
x=(x<0?-M_PI:M_PI)-x;
}
// Считаем
double res=0,u=x;
unsigned int cnt=0;
do
{
res+=u;
cnt+=2;
u=-u*x*x/cnt/(cnt+1);
}
while(abs(u)>numeric_limits<double>::epsilon());
return res;
}

int main()
{
locale::global(locale(""));

double x;

while (true)
{
cout << "Введите x:";
cin >> x;
if (cin.fail())
{
cout << "Ошибка ввода" << endl;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
else
{
break;
}
}

cout.precision(18);
cout<<"Наша функция:"<<msin(x)<<endl
<<"Стандартная функция:"<<sin(x)<<endl;
return 0;
}

Пример работы:
Код:
Введите x:-111
Наша функция:0.864551448610612061
Стандартная функция:0.864551448610608286
5
Форма ответа