맥클로린 급수
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
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); }
}
}
}
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가 나오면 되는데 거의 나오네요.
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.")
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))
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가 뜨네요... 이에 대한 대응방안에 대해서는 다시 한 번 생각해보겠습니다...
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)
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))
자바로 풀어봤습니다.
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);
}
}
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)
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)))