2014-12-23 1 views
0

Я пытаюсь реализовать свою собственную функцию sin (x) через серию maclaurin с помощью программы C, Это то, что у меня есть до сих пор, я сначала работал над всем на бумаге, а затем попытался реализовать его в кодseries using program

#include<stdio.h> 
#define PI 3.141592653589793238462643383 
int main() 
{ 
int x,nOfterms,term=1,i,j; 
double numerator,sum=0.0,radius; 
long int denominator; 
printf("\n\t\tINPUT:"); 
printf("\n\t\t------"); 
printf("\n\t\tEnter the value for x in degrees: "); 
scanf("%d",&x); 
printf("\n\t\tEnter the value for number of terms: "); 
scanf("%d",&nOfterms); 
printf("\n\t\tOUTPUT:"); 
printf("\n\t\t-------"); 
radius=x*(PI/180.0); 
printf("\n\t\tThe radius value for the given x value is: %lf",radius); 
for(i=1;i<=nOfterms;i+=2) 
{ 
    numerator=1.0; 
    denominator=1; 
    for(j=1;j<=i;j++) 
    { 
     numerator=numerator*radius; 
     denominator=denominator*j; 
    } 
    sum=(sum+numerator)/(denominator*term); 
    term=term*-1; 
} 
printf("\n\t\tThe value for sin %d is: %lf",x,sum); 
printf("\n\n\n"); 
return 0; 
} 

Я не могу использовать math.h вообще в моем коде или так же говорит профессор, Мой выход все нули, которые не является правильным, очевидно, и я был бы признателен, если кто-то может мне помочь с этим, также, если кто-то может предложить способ, которым я могу видеть каждую итерацию для каждого числа термина серии на экране до того, как я прихожу к ответу, попытался поместить последний printf в цикл for, но я в конечном итоге с странными символами и цифрами.

+0

Если проблема с математикой, это не правильный сайт (хотя кто-то может еще быть в состоянии помочь). Если проблема связана с кодом, вы получите лучший ответ, если опубликуете то, что вы пытаетесь реализовать. –

ответ

1

Проблема в реализации серии Mac Laurin. Линия

sum=(sum+numerator)/(denominator*term); 

неправ. Это должно быть просто:

sum += numerator/denominator*term; 

Осталось в порядке. Я попробовал это и нашел sin (30) = 0,5, sin (60) = 0,866 и даже sin (90) ~ 1.

Но вы algorythm не очень эффективны, поскольку для каждого термина вы начинаете с 1/1, когда первые элементы i n/i! уже были рассчитаны на предыдущий период.

Вы можете изменить контуры для:

numerator=1.0; 
denominator=1; 
j = 1; 
for(i=1;i<=nOfterms;i+=1) 
{ 
     numerator=numerator*radius; 
     denominator=denominator*j++; 
     sum += numerator/denominator*term; 
     term=term*-1; 
     numerator=numerator*radius; 
     denominator=denominator*j++; 
} 

Испытано и дают одинаковые (правильные) результаты.

+0

Спасибо, сержант, теперь я понимаю, что я делаю неправильно, это так расстраивает, что я могу сделать это на бумаге, но я не могу понять, как его реализовать в коде, будет ли какая-либо книга c, которая касается того, как реализовать математику алгоритмы, которые вы можете порекомендовать – HummingDev

+0

@ HummingDev: Не совсем. Я могу просто дать вам старый совет: держаться подальше от клавиатуры, пока вы не напишете алгоризм в псевдокоде с бумагой и карандашом, и только затем переведите его в истинном C (или на каком-либо другом языке). –

+0

хорошо, cheerz :) – HummingDev

0

Вот некоторые проблемы с вашим кодом, чтобы помочь вам вместе:

  • Вы хотите увеличить i на 1, а не 2, как вы подсчитывать количество терминов.

  • Для каждого термина, вы хотите только нечетные степени x, так что j вам нужно увеличить на 2 (изменить верхний предел и знаменатель факторного расчет должным образом)

  • Эта линия является неправильной: sum=(sum+numerator)/(denominator*term); и должен быть предположительно sum=sum+numerator/(denominator*term);

Надеюсь, что это поможет с вашим назначением.

0

Неправильный ваш внутренний for. отслеживать вручную через него несколько значений i:

1: numerator=radius, denominator=1 (correct) 
2: numerator=radius, denominator=1 (incorrect) 
3: numerator=radius*radius, denominator=3 (incorrect) 

Правильная внутренняя петля должна быть:

for (j = 1; j < i*2; ++j) 
{ 
    numerator = numerator * radius; 
    denominator = denominator * j; 
}