기본 콘텐츠로 건너뛰기

[matplotlib] 등고선(Contour)

극대와 극소(Maxima and Minima)

극대와 극소(Maxima and Minima)

실제 상황의 어떠한 작업이나 활동을 여러 변수들의 관계인 함수로 표현할 수 있다면 그 함수의 미분에 의해 극대값 또는 극소값을 발견할 수 있습니다. 이러한 결과는 작업 비용을 최소화하거나 효율성을 극대화할 수 있는 합리적 근거를 제시할 수 있으므로 다양한 엔지니어링에서 극대와 극소는 중요한 문제로 다루어 집니다.

함수의 극대와 극소에 관한 관계를 알아보기 위해 다음과 같이 간단한 식으로부터 시작해봅니다.

y=x24x+7
표 1. y=x24x+7에 따른 x, y 좌표
x 0 1 2 3 4 5
y 7 4 3 4 7 12

그림 1은 표 1을 나타낸 것으로 y의 극소값은 x = 2에서 3으로 나타낼 수 있습니다. 그러나 그 극소의 x 좌표가 2 주위의 어떤 값, 예를 들어 2.02 등과 같이 2+dx가 아닌 정확히 2라는 것을 확정할 수 있을까요?

x=np.arange(6)
y=x**2-4*x+7
x1=np.linspace(-1, 5, 100)
y1=x1**2-4*x1+7
plt.figure(dpi=100)
plt.plot(x1, y1)
plt.scatter(x, y)
plt.grid(True)
plt.ylim(0, 14)
plt.xlabel("x", size="12", weight="bold")
plt.ylabel("y", size="12", weight="bold")
plt.show()
그림 1. y=x24x+7.

질문에 답하기 위해 잠정적으로 최소가 되는 지점 주위의 많은 값들에 대응하는 y값들을 비교하는 방식으로 계산할 수 있습니다. 그러나 이러한 방식으로는 동일한 계산을 반복 하는 것은 번거로울 뿐만 아니라 정확한 지점을 찾는 것은 쉽지 않습니다.

다른 예인 y=3xx2의 그래프는 그림 2와 같습니다. 이 곡선이 통과하는 몇 개의 좌표들은 다음과 같습니다. 이 함수의 경우 그림 1의 함수와는 달리 극값의 좌표를 특정하기는 쉽지 않습니다.

x=np.arange(-1,6)
y=3*x-x**2
pd.DataFrame([x, y], index=['x', 'y'])
0 1 2 3 4 5 6
x -1 0 1 2 3 4 5
y -4 0 2 2 0 -4 -10
x1=np.linspace(-1, 5, 100)
y1=3*x1-x1**2
plt.figure(dpi=100)
plt.plot(x1, y1)
plt.scatter(x, y)
plt.grid(True)
plt.xlabel("x", size="12", weight="bold")
plt.ylabel("y", size="12", weight="bold")
plt.show()
그림 2. y=3xx2.

x = 1과 x = 2 사이 어딘가에 최대 값이 있음이 분명합니다. y의 최대 값이 약 214 정도라고 추정할 수 있습니다. x = 1과 2 사이의 많은 좌표들로부터 시행착오(trial-error) 방법으로 이 값을 계산할 수 있습니다. 그러나 여전히 이러한 방법으로 계산한 극대값이 정확한가에 대한 의문은 존재할 것입니다. 시행착오법 극대와 극소점에서의 함수의 일차 미분계수 dydx=0되는 특성을 적용하여 위의 두 함수의 극소값과 극대값을 계산해 봅니다. (미분의 기하학적 의미 참조)

첫번째 식 y=x24x+7의 극소값을 찾기 위해 미분 계수가 0이 되는 지점의 x값을 계산해봅시다.

x=symbols("x")
y=x**2-4*x+7
dy=diff(y, x)
dy
2x−4
x_min=solve(dy, x)
x_min
[2]

x = 2에 대응하는 y값이 이 함수의 극소값이 됩니다. 다음의 계산과 같이 극소값은 3이 됩니다. 이 값은 그림 1에 나타낸 값과 같습니다.

y_min=y.subs(x, x_min[0])
y_min
3

위 과정을 그림 2에서의 최소값을 찾기 위해 적용하면 다음과 같습니다.

x=symbols("x")
y=3*x-x**2
dy=diff(y, x)
dy
3−2x
x_max=solve(dy, x)
x_max
[3/2]
y_max=y.subs(x, x_max[0])
y_max
94

위 결과에 의하면 이 식의 극대값은 1과 2의 중간에 해당하는 x값에 대응하는 y값으로 94입니다. 이 결과는 시행착오법에 의한 추정으로 일어날 수 있는 불확실성을 제거하여 줍니다. 그러나 위 예들에서 결과가 극대인지 극소인지를 어떻게 결정할 수 있을까요? 물론 위 예의 경우 모두 이차방정식으로 그림 1과 2처럼 그래프의 형태를 알고 있기 때문에 그러한 결정은 문제 되지 않습니다. 다음 함수는 위의 예들 보다 좀 복잡한 형태를 가지는 함수 입니다.

다음 방정식의 극값을 발견하기 위해 위와 동일한 과정을 취합니다.

y=4x+1x
x=symbols("x")
y=4*x+1/x
dy=diff(y)
dy
41x2
x_m=solve(dy, x)
x_m
[-1/2, 1/2]
y_m=[y.subs(x, i) for i in x_m]
y_m
[-4, 4]

위 결과는 두 개의 극값을 가집니다. 이들 중 극소와 극대를 어떻게 결정할 수 있을까요? 가장 간단한 방법으로 극값 주위의 값들과 비교로 알 수 있을 것입니다. 다음 코드는 10 구간의 y값들을 나타낸 것입니다. 이 결과에 의하면 -0.5에서 극대값임을 알 수 있습니다.

y1=[(i, N(y.subs(x, i), 3)) for i in [-1, -0.7, -0.5, 0.3, 0]]
y1
[(-1, -5.00), (-0.7, -4.23), (-0.5, -4.00), (0.3, 4.53), (0, zoo)] # zoo=무한대

다음은 01 구간의 y값들을 나타낸 것입니다.

y2=[(i, N(y.subs(x, i), 3)) for i in [0, 0.3, 0.5, 0.7, 1]]
y2
[(0, zoo), (0.3, 4.53), (0.5, 4.00), (0.7, 4.23), (1, 5.00)]

위 결과들로 부터 x=0.5에서 극소값이 됨을 알 수 있습니다. 극소값 또는 극대값을 분류하기 위해 2차미분을 적용할 수 있습니다.(곡선의 곡률 참조)

숫자가 60을 두 부분으로 나누어 나눈 부분을 곱했을 경우 극대값을 발견하라는 요청을 가정해 봅니다. 이 경우 함수의 형태가 아니므로 위에서 사용한 미분계수 = 0을 적용할 수 없습니다. 당연히 여러 번 시도에 의해 결정할 수밖에 없습니다. 예를 들어 50과 10으로 구분하면 500이 됩니다. 이와 같이 반복해서 계산해 보면 다음과 같은 결과를 나타냅니다.

y1=[(i, i*(60-i)) for i in range(0, 61, 10)]
y1
[(0, 0), (10, 500), (20, 800), (30, 900), (40, 800), (50, 500), (60, 0)]

위 결과에 의하면 반으로 구분할 경우에서 극대값을 나타냅니다. 위 과정을 임의 수인 n에 적용해 봅니다. 이 경우 반으로 나누어 곱한 결과는 n(n-x)가 될 것입니다. (0xn)

y=x(nx)

위 함수의 극값은 dydx=0인 지점에서 생성됩니다. 그러므로 위 함수를 미분하여 극점을 찾으면 다음과 같습니다.

n, x=symbols("n, x")
y=x*(n-x)
dy=diff(y, x)
dy
n-2x
x_m=solve(dy, x)
x_m
[n/2]

위 결과로부터 n이 어떤 수이든 그것을 반으로 나누어 곱할 경우 극대값이 됨을 알 수 있습니다.

y_m=y.subs(x, x_m[0])
y_m
n24

극대값은 14n2이 됩니다. 이 결과로 부터 어떤 수가 n, m, p로 분해된다면 즉 N = n + m + p가 성립하면 n = m = p인 경우 n × m × p가 극대값이 된다는 규칙으로 일반화 할 수 있습니다.

예 1)
 함수 y의 극대와 극소값?

y=13x32x2+3x+1
n, x=symbols("n, x")
y=x**3/3-2*x**2+3*x+1
dy=diff(y, x)
dy
x2−4x+3
x_m=solve(dy, x)
x_m
[1, 3]
y_m=[y.subs(x, i) for i in x_m]
y_m
[7/3, 1]

위 결과와 같이 두 개의 극값이 생성됩니다. 이 값들을 결정하기 위해서 각 극점 주위의 값들을 살펴봅니다.

y1=[(i, N(y.subs(x, i),3)) for i in np.arange(0, 5.1, 0.5)]
y1
[(0.0, 1.00),
 (0.5, 2.04),
 (1.0, 2.33),
 (1.5, 2.13),
 (2.0, 1.67),
 (2.5, 1.21),
 (3.0, 1.00),
 (3.5, 1.29),
 (4.0, 2.33),
 (4.5, 4.38),
 (5.0, 7.67)]

위 결과 중 빨간색으로 표시한 부분이 극값입니다. x = 1과 3에서 변화를 보입니다. 그러나 그림 3에서 나타낸 것과 같이 이 값들은 모든 범위에서 최대, 최소값이 아닙니다. 즉, 극대와 극소값은 일정한 범위에서의 최대, 최소를 의미합니다. 이러한 의미를 명확히 하기 위해 일정한 범위에서의 극대, 극소값을 국소 극대값(local maximum)국소 극소값(local minimum)이라고 합니다.

x1=np.linspace(-0.1, 4, 100)
y2=[y.subs(x, i) for i in x1]
plt.figure(dpi=100)
plt.plot(x1, y2, label=r"$\mathbf{\frac{1}{3}x^3-2x^2+3x+1}$")
plt.scatter([y1[2][0], y1[6][0]], [y1[2][1], y1[6][1]], color="red")
plt.xlabel("x", size=12, weight="bold")
plt.ylabel("y", size=12, weight="bold")
plt.legend(loc="best")
plt.grid(True)
plt.show()
그림 3. 곡선에서의 국소 극대와 극소.

예 2)
 중심 좌표가 (a, b)이고 반지름이 r인 원의 방정식을 고려합니다.

(yb)2+(xa)2=r2
그림 4. 원에서의 극대와 극소.

그림 4로부터 극대값은 b+r, 극소값은 b-r임을 알 수 있습니다. 이러한 극값은 미분 계산을 통해 계산할 수 있습니다. 이 적용을 위해 양함수로 표현된 원의 방정식을 다음과 같이 음함수로 전환합니다. 이 과정을 코드화하기 위해 solve() 함수를 사용합니다.

y=±r2(xa)2+b
a, b, r, x, y=symbols("a, b, r, x, y")
eq=(y-b)**2+(x-a)**2-r**2
y1=solve(eq, y)
y1
[b(a+r+x)(a+rx), b+(a+r+x)(a+rx)]

두 개의 음함수가 생성됩니다. 즉, 양함수인 원의 방정식을 음함수로 전환하면 원의 중심 축을 기준으로 윗부분과 아랫부분의 방정식으로 구분됩니다. 그러므로 윗부분의 극값이 극대값, 아랫부분의 극값이 극소값이 될 것입니다. 이러한 결과는 아래 코드로 구현됩니다.

#아래부분 함수 
y11=y1[0]
dy11=y11.diff(x)
dy11
(a+r+x)(a+rx)(ax)(a+r+x)(a+rx)
dy11_m=solve(dy11, x)
dy11_m
[a]
y11.subs(x, a)
br2
#윗부분 함수 
y12=y1[1]
dy12=y12.diff(x)
dy12
(a+r+x)(a+rx)(ax)(a+r+x)(a+rx)
d_m=solve(dy12, x)
d_m
[a]
y12.subs(x, a)
b+r2

위 결과를 정리하면 다음과 같습니다.

극좌표 x = a에서

  • y = b + r : 극대값
  • y = b - r : 극소값

예 3)
y=ax3+bx+c의 경우 a와 b가 양수라면 극대와 극소?

x1=np.linspace(-10, 10, 100)
y2=3*x1**3+2*x1+3
plt.figure(dpi=100)
plt.plot(x1, y2, label=r"$\mathbf{3ax^3+bx+c}$")
plt.xlabel("x", size=12, weight="bold")
plt.ylabel("y", size=12, weight="bold")
plt.xticks([])
plt.yticks([])
plt.legend(loc="best")
plt.grid(True)
plt.show()
그림 5. 극값이 존재하지 않는 그래프.

위 식의 미분계수 = 0에 대한 해를 찾을 수 없으므로 극대, 극소는 존재할 수 없습니다. 이 식의 미분계수로부터 극값을 계산해 보면 다음과 같습니다.

a, b, c, x=symbols("a, b, c, x")
y=a*x**3+b*x+c
dy=diff(y, x)
dy
3ax2+b
x_m=solve(dy, x)
x_m
[-sqrt(3)*sqrt(-b/a)/3, sqrt(3)*sqrt(-b/a)/3]

위 코드는 미분계수가 0인 경우의 x 좌표값을 계산한 것으로 a와 b가 양수라는 조건에 따라 그 결과는 복소수입니다. 실수영역에서 이 함수의 극값은 존재하지 않습니다.

예 4)
  반지름이 r인 원에 새겨진 최대 면적의 직사각형의 변의 길이를 계산해 보겠습니다.

원내의 직사각형의 각 변의 길이는 그림 6과 같이 나타낼수 있습니다.

그림 6. 원 내에 사각형.

직사각형의 넓이 S는 다음과 같이 x의 함수가 됩니다.

S(x)=x4r2x2

이 예제는 결국 함수 S(x)의 극값을 계산하는 문제입니다. 즉, 함수의 미분계수를 발견하는 것으로 4rx2=u로 치환에 의한 미분의 곱법칙연쇄법칙을 적용하여 미분할 수 있습니다.(결합함수의 미분 참조) 이 포스트에서는 함수 diff()를 사용하면 다음과 같습니다.

r, x=symbols("r, x")
y=x*(sqrt(4*r**2-x**2))
dy=y.diff(x)
dy
x24r2x2+4r2x2
x_m=solve(dy, x)
x_m
[-sqrt(2)*r, sqrt(2)*r]

위 코드의 결과로 극값은 두개이지만 x는 길이이므로 양수이어야 합니다. 즉, x_m은 2r 입니다.

예 5)
  원뿔형 물탱크의 용량이 최대가 되기 위한 r을 계산합니다. 그림 7은 물탱크의 단면입니다.

그림 7. 물탱크의 단면.

원뿔형 물탱크의 부피는 다음과 같이 계산합니다. 이 식의 극대값은 미분계수가 0이 되는 반지름 r을 계산하는 것입니다.

V=πr2h3=πr2l2r23

위 식에 대한 미분으로 극대값을 계산하면 다음과 같습니다.

l, r, x=symbols("l, r, x")
v=pi*r**2*sqrt(l**2-r**2)/3
dv=diff(v, r)
dv
πr33l2r2+2πrl2r23
r_m=solve(dv, r)
r_m
[0, -sqrt(6)*l/3, sqrt(6)*l/3]

r은 길이이므로 0이 아닌 양수이어야 합니다. 그러므로 6l3입니다.

예 6)
  함수 y의 극대와 극소값을 계산해 봅니다. 이 함수의 경우 두 함수의 결합으로 각 함수의 미분은 나눗셈 법칙을 적용합니다.

y=xx4+x4x
x=symbols("x")
y1=x/(x-4) 
y2=(x-4)/x
y1_de=denom(y1)
y1_nu=numer(y1)
y1_df=(y1_nu.diff(x)*y1_de-y1_nu*y1_de.diff(x))/y1_de**2
y1_df
4(x4)2
y2_de=denom(y2)
y2_nu=numer(y2)
y2_df=(y2_nu.diff(x)*y2_de-y2_nu*y2_de.diff(x))/y2_de**2
y2_df
4x2
y_df=y1_df+y2_df
simplify(y_df)
6432xx2(x28x+16)

위 결과는 원래의 함수를 diff()를 적용하여 미분한 결과와 같습니다. 그 결과로부터 극값을 계산해 봅니다.

y=x/(x-4) + (x-4)/x
dy=simplify(diff(y, x))
dy
6432xx2(x28x+16)
x_m=solve(dy, x)
x_m
[2]
y_re=[(N(x_m[0]+i, 3), N(y.subs(x, x_m[0]+i),3)) for i in [-0.5, 0, 0.5]]
y_re
[(1.50, -2.27), (2.00, -2.00), (2.50, -2.27)]

위 결과에 의하면 x = 2에서 극대값 -2입니다.

예 7)
  다음 함수의 극값 ?

y=1+x+1x

이 함수 역시 두 개 함수들의 합으로 구성되어 있습니다. 또한 각 함수의 미분을 위해 연쇄 규칙???을 적용할 수 있습니다.

x, u, v=symbols("x u v")
u1=1+x
y1=sqrt(u)
dy1=y1.diff(u)*u1.diff(x)
dy1
12u
dy1=dy1.subs(u, u1)
dy1
12x+1
v1=1-x
y2=sqrt(v)
dy2=y2.diff(v)*v1.diff(x)
dy2
12v
dy2=dy2.subs(v, v1)
dy2
121x
dy=dy1+dy2
dy
12x+1121x

원 함수를 직접 미분하여 극값을 계산해 봅니다.

y=(1+x)**(Rational('1/2'))+(1-x)**(Rational('1/2'))
dy=diff(y, x)
dy
12x+1121x
x_m=solve(dy, x)
x_m
[0]
y_re=[(i, N(y.subs(x, i),3)) for i in [-0.5, 0, 0.5]]
y_re
[(-0.5, 1.93), (0, 2.00), (0.5, 1.93)]

x = 0에서 y = 2는 극대값입니다.

예 8)
  다음 함수 y의 극값을 계산해 봅니다.

y=x252x4

이 함수의 미분은 나눗셈 법칙을 적용합니다.

dydx=2x(2x4)(x25)2(2x4)2=2x28x+10(2x4)2

diff()를 적용한 미분 결과를 활용하면 다음과 같습니다.

x=symbols("x")
y=(x**2-5)/(2*x-4)
dy=diff(y, x)
dy
2x2x42(x25)(2x4)2
x_m=solve(dy, x)
x_m
[2 - I, 2 + I]

위 결과 미분 = 0으로부터의 x의 해는 복소수만을 가집니다. 그러므로 실수영역에서 극소값이나 극대값은 존재하지 않습니다.

예 8)
 함수 (yx2)2=x5의 극대값?

y의 극대값을 계산하기 위해서는 양함수 형태인 현재의 함수를 음함수 형태로 전환하여야 합니다. 즉, 위 식을 y에 대해 정리하기 위해 sympy 함수인 Eq(), solve()함수를 적용합니다.

sympy의 함수들에 인수를 전달하기 위해서는 동차식(식 = 0)의 형태이어야 합니다. 그러나 두 개의 동차식을 '='로 연결해주는 함수인 Eq()를 사용하면 위 함수 형태를 유지할 수 있습니다.

x, y=symbols("x, y")
eq=Eq((y-x**2)**2, x**5)
eq
(x2+y)2=x5

위 식을 y에 대해 정리하기 위해 다음과 같이 solve()를 적용합니다. 이 함수에 전달하는 인수인 식은 동차식이어야 하지만 Eq()함수에 의해 생성된 식은 그 형태에 관계없이 인식합니다. 또한 이 함수는 지정한 변수의 해를 계산하는 것으로 아래 코드와 같이 y의 해 즉, y에 대해 식을 정리하는 결과를 반환합니다.

eq1=solve(eq, y)
eq1
[x**2 - sqrt(x**5), x**2 + sqrt(x**5)]

위의 결과에 의하면 변수 x에 정리된 음함수는 두 부분으로 구분됩니다. 그림 7.8은 이 함수들의 그래프입니다. 이 그래프에 의하면 하나의 극대값을 가집니다.

그림 8. (yx2)2=x5.

그림 8의 주황색 그래프에서 극점을 계산해 봅니다.

dv1=diff(eq1[0], x)
dv1
2x5x52x
x_m1=solve(dv1, x)
x_m1
[16/25]
[(N(i, 3), N(eq1[0].subs(x, i), 3)) for i in [x_m1[0]-0.1, x_m1[0], x_m1[0]+0.1]]
[(0.540, 0.0773), (0.640, 0.0819), (0.740, 0.0765)]

위 코드의 결과에 의하면 극대값이 존재합니다. 다음으로 그림 8의 파란색 그래프 부분에 대한 것으로 극값은 존재하지 않습니다.

dv2=diff(eq1[1], x)
dv2
2x+5x52x
x_m2=solve(dv2, x)
x_m2
[]

예 9)
 높이가 밑면(원) 반지름의 2배인 실린더의 부피가 증가할 경우 그 실린더의 다른 부분 역시 동일한 비율을 유지합니다. 밑면의 반경이 r(t)이며 표면적은 20 sec-1로 증가합니다. 실린더의 부피의 증가 비율을 계산해 봅니다.

표면적:S=2πr(t)2+2πr(t)2r(t)=6πr(t)2부피:V=πr(t)22r(t)=2πr(t)3

문제는 표면적의 시간 당 변화율에 대한 정보를 제공합니다. 즉,

dsdt=20secdS=20

이 정보로 부터 dV를 계산합니다. 계산과정은 다음과 같습니다.

dsdr=12πrds=12πrdrdVdr=6πr2dV=6πr2dr

예에서 dS값이 제공되었으므로 dr을 계산할 수 있습니다. 이 결과를 통해 dV를 계산합니다. 또한 반지름 r의 증가율은 시간 t에 대한 함수입니다. 그러나 t에 대한 구체적인 식은 주어지지 않았습니다. 이러한 경우 sympy에서는 Function() 함수에 의해 정의할 수 있습니다. 다음 코드에서 반지름 r, 표면적 S, 부피 V를 함수로 정의하였습니다.

t=symbols('t')
r=Function('r')(t)
S=Function('S')(r)
V=Function('V')(r)
r.diff(t)
ddtr(t)
S=6*pi*r**2
dSdr=S.diff(r)
dSdr
12πr(t)
dS=dSdr*r.diff(t)
dS
12πr(t)ddtr(t)

표면적 S를 반지름 r에 대해 미분한 것이며 이 결과로 부터 dS를 계산할 수 있습니다. 문제에서 dS = 20 이므로 이를 적용하여 dr을 계산할 수 있습니다. 이 계산은 solve()를 적용합니다.

dr=solve(Eq(dS, 20), r.diff(t))
dr
[5/(3*pi*r(t))]

위 계산 과정을 dV에서 동일하게 적용합니다.

V=2*pi*r**3
dV=V.diff(r)*r.diff(r)
dV
6πr2(t)
dV=dV*dr[0]
dV
10r(t)

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. (1)A=PBP1P1AP=B 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. (식 2)BλI=P1APλP1P=P1(APλP)=P1(AλI)P 식 2의 행렬식은 식 3과 같이 정리됩니다. det(BλI)=det(P1(APλP))=det(P1)det((AλI))det(P)=det(P1)det(P)det((AλI))=det(AλI)det(P1)det(P)=det(P1P)=det(I) 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a sin2(x)+cos2(x) simplify(a) 1 simplify(b) x3+x2x1x2+2x+1 simplify(b) x - 1 c=gamma(x)/gamma(x-2) c Γ(x)Γ(x2) simplify(c) (x2)(x1) 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. (식 1)Γ(n)={(n1)!n:자연수0xn1exdxn:부동소수 x=symbols('x') gamma(x).subs(x,4) 6 factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 x2=1의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. x21=0 import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. x21=0(x+1)(x1)=0x=1or1x4=1의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. x41=(x2+1)(x+1)(x1)=0x=±1,±1=±i,±1 실수...