이 페이지는 코딩도장 데이터의 읽기 전용 정적 보관본입니다.

멕클로린 급수를 이용하여 Sin, Cos 값을 계산하여 보자

맥클로린 급수
https://blog.naver.com/i_jeju/221525045733
이곳에 그림을 올리려니 어떻게 하는지 잘 모르겠군요.
그래서 블로그에 올리고 링크를 겁니다.
실제로 우리가 사용하는 언어에서 지원하는 삼각함수 같은 것들을 이런 반복식을 이용하여 계산 하는 것이죠.

sinx=∑{(-1)^n × x^(2n+1)} / (2n+1)!
cosx=∑{(-1)^n × x^(2n)} / (2n)!
x값은 라디안 입니다. 디그리:360도 -> 라디안 3.14159265358979..(^.^;) n은 0부터 시작 합니다.

!은 펙토리얼 입니다. m!=1×2×3×...×m

이 과제는 언어에서의 삼각함수 지원 없이 sin, cos을 계산하는 것 입니다.
tan도 계산 가능 하죠.
tanx = sinx/cosx

이런 정도의 실행결과가 나오면 되겠죠.

계산종류(sin,cos):cos
각도(라디안으로)):3.141592
반복횟수:20
-0.9999999999997866

계산종류(sin,cos):sin
각도(라디안으로)):3.141592
반복횟수:20
6.53589793306246e-07

삼각함수 MacLaurin Series

2019/04/29 09:58

이이충학

10개의 풀이가 있습니다.

C#

using System;
using System.Numerics;

namespace CD225
{
    internal class Program
    {
        private static void Main()
        {
            MaclaurinSeries testCase = new MaclaurinSeries(3.141592, 20);
            Console.WriteLine(testCase.Sin());
            Console.WriteLine(testCase.Cos());
            Console.WriteLine(testCase.Tan());
        }
    }

    public class MaclaurinSeries
    {
        private readonly double Radian;

        private readonly BigInteger MaxIndex;

        public MaclaurinSeries(double radian, BigInteger maxIndex)
        {
            Radian = radian;
            MaxIndex = maxIndex;
        }

        public double Sin()
        {
            double sum = 0;
            for (BigInteger n = 0; n <= MaxIndex; n++)
            {
                sum += Math.Pow(-1.0, (double)n) / (double)GetFactorial(2 * n + 1)
                    * Math.Pow(Radian, (double)(2 * n + 1));
            }
            return sum;
        }

        public double Cos()
        {
            double sum = 0;
            for (BigInteger n = 0; n <= MaxIndex; n++)
            {
                sum += Math.Pow(-1.0, (double)n) / (double)GetFactorial(2 * n)
                    * Math.Pow(Radian, (double)(2 * n));
            }
            return sum;
        }

        public double Tan()
        {
            return Sin() / Cos();
        }

        private static BigInteger GetFactorial(BigInteger n)
        {
            if (n == 0) { return 1; }
            else { return n * GetFactorial(n - 1); }
        }
    }
}

2019/04/29 13:38

mohenjo

def fat(n): #펙토리얼
    ff=1
    for i in range(1,n+1):
        ff *= i
    return ff

def Msin(x,n):  #sin 계산
    sinx=0
    for i in range(n):
        sinx += (-1)**i * x**(2*i+1) / fat(2*i+1)
    return sinx

def Mcos(x,n):  #cos 계산
    cosx=0
    for i in range(n):
        cosx += (-1)**i * x**(2*i) / fat(2*i)
    return cosx

tri=input('계산종류(sin,cos):')
seta=float(input('각도(라디안으로)):'))
num=int(input('반복횟수:'))

if tri=='sin':
    print(Msin(seta,num))
elif tri=='cos':
    print(Mcos(seta,num))
else:
    print(tri,"????")

실행
계산종류(sin,cos):sin
각도(라디안으로)):0.5235986666666667
반복횟수:20
0.49999990566243635

0.52359... 30도 입니다. 0.5가 나오면 되는데 거의 나오네요.

2019/04/30 12:06

이이충학

def fac(n):
    if n==0:
        return 1
    else:
        mul=1
        for i in range(1,n+1):
            mul*=i
        return mul


def sin(x,n):
    sum=0
    for i in range(n):
        sum+=((-1)**i*x**(2*i+1))/fac(2*i+1)
    return sum

def cos(x,n):
    sum=0
    for i in range(n):
        sum+=((-1)**i*x**(2*i))/fac(2*i)
    return sum

usertype=input("Input function (sin/cos): ")
userangle=eval(input("Input the angle in radian: "))
useriter=int(input("Input number of iterations: "))

if usertype=='sin':
    print(sin(userangle,useriter))
elif usertype=='cos':
    print(cos(userangle,useriter))
else:
    print("Invalid input.")

2019/05/03 18:25

ykleeac

python 3.6

def Trigonometric_Func(cal_type, radian, repetition):
    temp = 0
    if cal_type == 'sin':
        for n in range(repetition):
            factorial = 1
            for i in range(1, 2*n+2):
                factorial *= i
            temp += ((-1)**n)*(radian**(2*n+1))/factorial
        return temp
    elif cal_type == 'cos':
        for n in range(repetition):
            factorial = 1
            for i in range(1, 2*n+1):
                factorial *= i
            temp += ((-1)**n)*(radian**(2*n))/factorial
        return temp
    else:
        return Trigonometric_Func('sin', radian, repetition)/Trigonometric_Func('cos', radian, repetition)


X = input('calculation type (cos, sin, tan):').lower()
Y = eval(input('angle (in radian):'))
Z = eval(input('N of repetition:'))
print(Trigonometric_Func(X, Y, Z))

2019/05/19 16:26

최상혁

python

import math # 180도에 해당하는 radian 값은 math.pi
x = float(input('radian 값을 입력하세요> '))
n = int(input('integer 값을 입력하세요> '))
def factorial(m):
    if m == 0:
        return 1
    if m >= 1:
        res = 1
        for i in range(1, m + 1):
            res *= i
        return res
def mac_sin(x, n):
    sum = 0
    for i in range(0, n+1):
        a = ((-1)**i * x**(2*i+1)) / factorial(2*i+1)
        sum += a
    return round(sum, 3)
def mac_cos(x, n):
    sum = 0
    for i in range(0, n+1):
        a = ((-1)**i * x**(2*i)) / factorial(2*i)
        sum += a
    return round(sum, 3)
def mac_tan(x, n):
    return round(mac_sin(x, n) / mac_cos(x, n), 3)
res_dict = dict(zip(['x', 'n', 'sin', 'cos', 'tan'],
                    [x, n, mac_sin(x, n), mac_cos(x, n), mac_tan(x, n)]))
print(res_dict)

n의 값이 100 이상으로 커지면 정수 값이 너무 커서 계산결과를 출력하지 못한다는 error가 뜨네요... 이에 대한 대응방안에 대해서는 다시 한 번 생각해보겠습니다...

2019/08/03 23:00

apriori

def factorial(N):
    if N<=1:
        return 1
    else:
        return N*factorial(N-1)
kind=input("계산 종류(sin,cos):")
radian=float(input("각도(라디안으로):"))
n=int(input("반복횟수:"))
if kind=="sin":
    sum=0
    for i in range(0,n+1):
        a=(-1)**i * radian**(2*i+1)/factorial(2*i+1)
        sum+=a
    print(sum)
else:
    sum=0
    for i in range(0,n+1):
        a=(-1)**i * radian**(2*i)/factorial(2*i)
        sum+=a
    print(sum)

2020/05/02 22:56

kim center

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

def sin(x, n):
    temp = pow(-1, n) * pow(x, 2 * n + 1) / factorial(2 * n + 1)
    return temp

def cos(x , n):
    temp = pow(-1, n) * pow(x, 2 * n) / factorial(2 * n)
    return temp
sine = 0
cosine = 0
rad = float(input('radian: '))
for i in range(0, 20):
    sine += sin(rad, i)
for j in range(0, 20):
    cosine += cos(rad, i)

print('sin({}) = {}'.format(rad, sine))
print('cos({}) = {}'.format(rad, cosine))
print('tan({}) = {}'.format(rad, sine / cosine))

2021/01/29 00:22

김민수

자바로 풀어봤습니다.

import java.util.Scanner;

public class test {
    public static double calculateCos(double rad, int cycle) {
        double result = 0;

        for(int i=0; i<cycle; i++) {
            double sign = (int)Math.pow(-1, i);
            double numerator = 1;
            for(int j=1; j<=2*i; j++) {
                numerator *= j;
            }
            double denominator = Math.pow(rad, i*2);

            result = result + (double)sign*(denominator/numerator);
        }

        return result;
    }

    public static double calculateSin(double rad, int cycle) {
        double result = 0;

        for(int i=0; i<cycle; i++) {
            double sign = Math.pow(-1, i);
            double numerator = 1;
            for(int j=1; j<=(2*i+1); j++) {
                numerator = numerator*j;
            }
            double denominator = Math.pow(rad, (2*i+1));

            result = result + (double)sign*(denominator/numerator);
        }

        return result;
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.print("계산종류(sin, cos, tan) 입력:");
        String angleFunction = scan.nextLine();
        System.out.print("각도(rad) 입력:");
        double rad = scan.nextDouble();
        System.out.print("반복 횟수:");
        int cycle = scan.nextInt();

        double result = 0;

        if(angleFunction.equals("cos")) {
            result = calculateCos(rad, cycle);
        }else if(angleFunction.equals("sin")) {
            result = calculateSin(rad, cycle);
        }else if(angleFunction.equals("tan")) {
            double otherResult = calculateCos(rad, cycle);
            result = calculateSin(rad, cycle);  
            result = result/otherResult;
        }

        System.out.println("결과 :"+result);
    }
}

2022/06/14 23:04

유로

import math

def factorial(N):
    fac = 1
    for i in range(1, N + 1):
      fac *= i
    return fac

type = input('계산종류(sin, cos): ')
angle = input('각도(라디안으로): ')
repetition = int(input('반복횟수: '))

x = float(angle)

if type =='sin':
  sinx = 0
  for n in range(0,repetition):
    sinx += ((-1)**n)*(x**(2*n+1))/factorial(2*n+1)
  print(sinx)

if type =='cos':
  cosx = 0
  for n in range(0,repetition):
    cosx += ((-1)**n)*(x**(2*n))/factorial(2*n)
  print(cosx)    

2023/07/13 10:41

스탠리

import math


def toRadian(x):
    return x * math.pi / 180

def facto(num):
    fact = 1
    for i in range(1, num+1):
        fact *= i
    return fact

def sSin(x, n):
    sinx = 0
    for i in range(n):
        sinx += (-1)**i * (x**(2*i +1)/facto(2*i+1))
    return sinx

def cCos(x, n):
    cosx = 0
    for i in range(n):
        cosx += (-1)**i * x**(2*i) / facto(2*i)
    return cosx


a = int(input('일반 각(0 ~ 360): '))
n = int(input('반복 횟수: '))
print('sin{0} = {1}'.format(a, sSin(toRadian(a), n)))
print('cos{0} = {1}'.format(a, cCos(toRadian(a), n)))
print('tan{0} = {1}'.format(a, sSin(toRadian(a), n)/cCos(toRadian(a), n)))

2023/08/11 21:45

insperChoi

목록으로