내용
단순한 형태의 미분
예 1)
두 변수 y와 x의 관계를 나타낸 함수
이 예제는 미분계수인
dx는 변수 x의 작은 양이므로 위 식에서
위 식2는 미세한 구간에서 x에 대한 y의 변화율을 나타내는 것으로 미분이라고 정의합니다. 다시말하면, 일반적인 미분의 정의인 식 3과 같이 나타낼 수 있습니다.
파이썬 sympy 패키지의 diff()
함수를 적용하여 다음과 같이 코드화 할 수 있습니다. 이 함수는 sympy객체.diff()
와 같이 메소드 형태로 적용할 수 있습니다.
x=symbols("x", real=True) y=x**2 diff(y)
2x
y.diff()
2x
x에 관한 다른 함수에 대해 생각해 봅니다.
예 1을 수치적으로 접근해 봅시다. 예를 들어 x=100일 때 y=10000이 됩니다. x의 증분 dx=1라면 y는 다음과 같습니다.
y1=101*101#y1=y+dy=(x+dx)2 y1
10201
위 결과에서 1은 전체값에 비해 작은 수이므로 무시할 수 있습니다. 그러므로 y=100200으로 dy=200이 됩니다. dy와 dx의 비율 즉, x에 관해 y의 미분은 다음과 같이 2x가 됩니다.
더 작은 수를 고려해 보기 위해 dx=0.1에서 미분을 계산해 봅니다.
x + dx = 100 + 0.1 = 100.1이므로 y는 다음과 같습니다.
y1=100.1*100.1 y1
10020.009999999998
위 결과에서 0.0099..는 전체 결과에서 매우 미미한 수준으로 무시할수 있기 때문에 y의 증분 dy=20으로 간주 할 수 있습니다. 그러므로
dx, dy=symbols("dx, dy", real=True) f=dy/dx f
f.subs([(dx,0.1),(dy, 20)])
200.0
예 2)
예 1과 같은 방법으로
위 식에서 (dx)2, (dx)3은 무시할 수 있습니다. 또한 y=x3이므로 다음과 같이 정리됩니다.
x=symbols("x", real=True) y=x**3 diff(y)
3x2
예 3)
y=x4을 미분해 봅니다.
위와 같이 고차 방정식을 전개하기 위해 sympy 패키지의 expand()
함수를 적용할 수 있습니다. 파이썬에서 곱셈과 거듭제곱은 각각 '*
'과 '**
'으로 표시됩니다.
x, dx=symbols("x, dx", real=True) f=(x+dx)**4 f
expand(f)
위 식에서 (dx)의 거듭제곱과 관계된 항들은 매우 작은 값들이므로 무시할 수 있으므로 다음과 같이 정리할 수 있습니다.
다음은 위 과정을 sympy함수들로 코드화한 것입니다.
x, dx=symbols("x, dx", real=True) y=Function('y')(x) diff(y)
y1=x**4 y1.diff(x)
4x3
Eq(y.diff(), y1.diff())
sympy에서 적용된 식은 동차 방정식(Homogeneous equation)의 형태 즉, 좌항 또는 우항이 0인 형태이어야 합니다. 이것은 각 식에 대한 객체 이름을 설정하기 위해서 입니다. 예를 들어 y = x2와 같은 식을 sympy객체로 만들면 y는 x를 변수로 하는 객체 이름입니다. 그러므로 y의 미분 표현을 나타내기 위해서는 eq1 = y, eq2 = x2과 같이 별도의 객체로 만들어야 합니다. 사용자가 y의 미분 표현
- 좌항과 우항을 별도의 함수로 설정
- 좌항 y는 종속변수이자 함수이므로 Function()함수로 선언
- 우항의 x는 독립변수이므로 symbols()함수로 선언
- 좌항과 우항을 각각 diff()를 적용하여 미분
- 각 미분항들을 Eq()함수를 사용하여 결합합니다.
다른 방법으로
x, dx=symbols("x, dx", real=True) y=Function('y')(x) eq=y-x**4 eq
eq.diff(x)
위에서 소개한 예들의 결과를 요약해 보면 다음과 같습니다.
y | |
---|---|
2x | |
| |
|
미분 규칙을
x, dx=symbols("x, dx", real=True) f=(x+dx)**5 expand(f)
위 결과에서
y=Function('y')(x) eq=y-x**5 eq.diff(x)
음의 거듭제곱 형태의 미분
예 1에서 소개한 미분 과정을 식
위 식의 우항 같은 다항식의 전개를 위해 이항정리를 적용할 수 있습니다.
이항정리를 적용하여 dx의 거듭제곱을 포함된 항들을 제거하면 식 2와 같습니다.
y=x-2이므로 위 식으로 부터 x에 대한 y의 미분은 다음과 같습니다.
위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.
x=symbols("x") y=Function('y')(x) eq1=x**(-2) Eq(y.diff(),eq1.diff())
분수형태의 거듭제곱의 경우
거듭제곱인자가 분수인 경우도 이항정리를 적용하여 미분을 정리할 수 있습니다.
위 결과는 위에서 소개한 미분 규칙에 의한 결과와 같습니다.
n, x=symbols("n, x") y=Function('y')(x) eq1=x**(1/n) y, eq1
(y(x), x**(1/n))
Eq(y.diff(),eq1.diff(x))
simplify(Eq(y.diff(),eq1.diff(x)))
위 코드의 마지막 명령인 simplify()
함수는 식을 보다 간단히 정리하기 위해 적용한 것입니다.
상수를 포함한 식의 미분
일반적으로 변수 x(독립변수)에 영향 받는 다른 변수 y(종속변수)의 관계를 나타낸 식에서 미분은 두 변수의 비율로 정의할 수 있습니다. 이러한 식에 독립변수와 관계 없지만 y에 영향을 주는 항 즉, 상수항이 포함여부는 그 비율에 양향을 주지 않습니다. 상수항은 변화될 수 없는 값이기 때문입니다. 어떠 함수에 상수항은 미분에 그 함수의 미분에 영향을 줄수 없음을 의미합니다.
x, dx, y, dy =symbols("x, dx, y, dy") f=y+dy f1=(x+dx)**3+5 F=Eq(f,f1) F
expand(F)
위 결과에서 dx의 거듭제곱을 포함한 모든 항들은 무시할 수 있으며
x=symbols("x") y=Function('y')(x) eq=x**3+5 F=Eq(y.diff(), eq.diff()) F
상수 곱
다음 식은 독립변수를 상수배한 형태입니다.
x, dx, y, dy =symbols("x, dx, y, dy") f=y+dy f1=7*(x+dx)**2 F=Eq(f,f1) expand(F)
위 결과에
F1=F.subs({y:7*x**2, dx**2:0}) F1
다음 단계로 위 결과를 dy에 의해 정리하기 위해 solve()
함수를 사용합니다.
위 결과를 정리하면 미분은 다음과 같습니다.
solve(F1, dy)
[7*dx*(dx + 2*x)]
(dx)2 ≈ 0으로 간주할 수 있으므로 최종적으로 위 결과는 다음과 같이 정리됩니다.
x의 각 값에 대한 y와
x | y | |
---|---|---|
1 | 7 | 14 |
2 | 28 | 28 |
3 | 63 | 42 |
4 | 112 | 56 |
5 | 175 | 70 |
-1 | 7 | -14 |
-2 | 28 | -28 |
-3 | 63 | -42 |
표 2의 (x, y), (x,
plt.figure(dpi=100) plt.plot(x, y, label=r"7$x^2$") plt.plot(x, dy, label=r"$\frac{dy}{dx}$") plt.axvline(x=0, linestyle="--", color='black') plt.xlabel("x", size=12, weight="bold") plt.ylabel("y", size=12, weight="bold") plt.legend(loc="best") plt.show()
상수에 의한 곱에 대한 미분은 미분 규칙의 확장으로 다음과 같이 계산됩니다.
위의 미분은 상수에 의한 곱 외에 나눗셈 역시 적용됩니다.
x =symbols("x") y=Rational('1/7')*x**2 y.diff()
위 코드에서 사용한 Rational()
함수는 인수로 전달한 분수 형태를 유지하므로 계산 결과 역시 분수 형태로 반환됩니다.
상수항과 상수에 의한 곱셈 등에 대한 몇 가지 예들을 고려해봅니다.
예 4)
다음 함수 y를 미분합니다.
x =symbols("x") f=x**5*Rational('1/7')-Rational('3/5') f.diff()
예 5)
다음 무리수가 포함된 식을 미분 해봅니다.
a, x =symbols("a, x") f=a*sqrt(x)-Rational('1/2')*sqrt(a) f.diff(x)
다음 식은 양함수 구조이므로 이 식의 미분은 하나의 변수 즉, y에 대해 식을 정리한 다음 미분을 실시합니다.
위 식을 최종적으로 y로 정리하여 미분하면 다음과 같습니다.
위 과정은 sympy 함수 Eq()
등을 적용하여 다음과 같이 계산할 수 있습니다.
a, b, x, y =symbols("a, b, x, y") eq=a*y+b*x-(b*y-a*x+(x+y)*sqrt(a**2-b**2)) eq
eq=collect(eq, (x, y)) eq
위 코드에 입력한 식은 collect()
함수를 사용하여 지정한 변수 x, y에 의해 정리하였습니다. 위 eq를 y에 대해 정리하기 위해 solve()
함수를 사용합니다. 이 함수는 식에서 지정한 변수에 대한 해를 계산하는 것으로 위 식 eq에 대한 y의 해를 계산하는 것과 같습니다.
eq1=solve(eq, y) eq1
최종적으로 eq1을 x에 관해 미분합니다.
print(diff(eq1[0], x))
예 6)
반지름 r, 높이 h인 실린더의 부피는
r,h =symbols("r,h") V=pi*r**2*h V
V1=diff(V,r) V1
N(v1.subs([(r,5.5),(h, 20)]),4)
691.1
sympy와 numpy 등 파이썬에서 π는 pi
로 나타냅니다. 이러한 기호와 함수의 값을 평가하기 위해 N()
또는 .evalf()
를 적용합니다. 이 함수와 메서드에서는 유효숫자를 지정하여 표현되는 수의 형태를 조정할 수 있습니다.
pi
N(pi, 3)
pi.evalf(3)
r = h인 조건에서 반지름 1 in. 당 400 cm3의 변화가 일어나는 실린더의 차원을 계산해 봅니다.
v11=v1.subs(h,r) print(v11)
sol=solve(Eq(v11, 400), r) sol
sol[1].evalf(3)
미분 식에 r = h인 조건을 충족시키기 위해 높이 h를 반지름 r로 치환했습니다. 이 때 변화율이 400 cm3이 될 때의 r값은 solve()
함수로 계산하였습니다. 그 결과는 반지름이므로 양의 값이 되어야 하므로 sol 중 두번째 값이 됩니다.
예 7)
Féry의 방사선 고온계는 다음 식과 같이 온도에 의해 값을 나타냅니다.
θ1는 알려진 온도 t1에 대응하는 방사선 고온계의 값입니다. 1000°C 일때 25라면 800°C, 1000°C, 1200°C 일때의 변화량을 계산해 봅시다.
theta1, t, t1 =symbols("theta1, t, t1") theta=Function("theta")(t) eq1=(t/t1)**4*theta1 eq1
Eq(theta, eq1)
#계산에 필요한 부분은 우항 eq=eq1.subs({t1:1000, theta1:25}) eq
dth=eq.diff(t) dth
t_val=[800, 1000, 1200] re={} for i in t_val: re[i]=dth.subs(t, i).evalf(3) re
{800: 0.0512, 1000: 0.100, 1200: 0.173}
댓글
댓글 쓰기