기본 콘텐츠로 건너뛰기

라벨이 sympy인 게시물 표시

[matplotlib]quiver()함수

함수 그래프: 임계점 표시

다음 그래프들은 전자책 파이썬과 함께하는 미분적분 의 5.2 장에 소개된 그래프와 코드들입니다. import numpy as np import pandas as pd from sympy import * import matplotlib.pyplot as plt import seaborn as sns sns.set_style("darkgrid") #그림 5.2.2 x=np.linspace(-.5, 6, 100) f=(x-2)**4+1 g=(x-2)**3+1 plt.figure(figsize=(4, 3)) plt.plot(x, f, color="g", label="f(x)") plt.plot(x, g, color="b", label="g(x)") plt.hlines(1, -0.5, 6, color="k", ls="--") plt.scatter(2, 1, s=50, c="r", label="crtical point") plt.xlabel("x", fontsize="11") plt.ylabel("y", rotation="horizontal", fontsize="11") plt.ylim((-11, 11)) plt.legend(loc="best", labelcolor=['g','b','r'], frameon=False) plt.show() #그림 5.2.3 a=symbols("a", real=True) f=3*a**5-20*a**2-1 df=f.diff(a) c=[float(i) for i in solve(df)] ddf=df.diff(a) x=np.linspace(-.5, 4, 100) fy=[f.subs(a, i) for i in x] ...

[Linear Algebra] 파이썬으로 행렬 객체 만들기

행렬 객체 만들기 python에서 행렬 객체를 생성하기 위해서는 numpy, pandas 모듈을 사용합니다. numpy 모듈에서 array() 함수는 다른 행렬 객체를 생성하는 대부분 함수의 기반이 되는 함수입니다. import numpy as np from sympy import * x=np.array([1,2,3]); x array([1, 2, 3]) 위 객체 x는 3개의 요소로 구성된 벡터입니다. 즉 하나의 차원을 가집니다( 차원(dimension) 참조). 객체의 차원과 그에 따른 형태는 각각 .ndim, .shape 속성을 확인할 수 있습니다. x.ndim, x.shape (1, (3,)) 위 결과에 의하면 객체 x는 1차원으로 3개의 요소들로 구성됨을 나타냅니다. 같은 요소들로 구성된 다음 객체 x1은 행렬입니다. x1=np.array([[1],[2],[3]]); x1 array([[1], [2], [3]]) print(x1) [[1] [2] [3]] 파이썬의 함수 print() 는 결과의 자료형 등의 속성을 배제한 상태로 출력합니다. x1.ndim, x1.shape (2, (3, 1)) 객체 x1는 2차원 즉, 2개의 축으로 행과 열로 구성됩니다. 그러나 행 또는 열 중 하나가 1일 경우 실제적으로 1차원인 벡터입니다. 파이썬에서 벡터와 행렬을 구분한다는 것은 매우 중요합니다. 벡터, 행렬 연산의 경우 기본적으로 차원을 조정해야 하기 때문입니다. 예를 들어 행과 열이 바꾸는 것을 전치(transpose)라고 하며 객체.T 로 실행됩니다. 그러나 벡터일 경우는 실행되지 않습니다. x.T array([1, 2, 3]) x1.T array([1, 2, 3]) 벡터인 객체 x를 행렬로 변경하기 위해 numpy객체.reshape(행의 수, 열의 수) 메소드를 사용할 수 있습니다. 이 함수에서 행의수 또는 열의수에 -1을 지정하면 다른쪽에 지정된 수에 의해 자동으로 변환됩니다. 예를 ...

[Linear Algebra] 선형변환(Linear transformation)

선형변환(Linear transformation) T: U → V은 벡터 공간의 U를 다른 벡터 공간 V로 옮기는 변환(함수)를 나타냅니다. 이 변환이 선형변환(Linear transformation)이 되기 위해서는 선형결합의 성립을 위한 식 1의 조건을 만족해야 합니다. 즉, 선형결합이 성립되는 벡터들은 선형변환이 가능하다는 것을 의미합니다. \begin{align} &\forall \; \text{u}_1,\; \text{u}_2 \in \text{U} \rightarrow T(\text{u}_1 + \text{u}_2) = T(\text{u}_1)+T(\text{u}_2)\\ &\forall \; \text{u} \in \text{U} \cap α \in \text{C} \rightarrow T(\alpha \text{u}) = \alpha T(\text{u})\\&u,\, v:\; \text{벡터, 스칼라} \end{align} (식 1) 예 1) 다음 식이 선형변환인지를 결정합니다. $$T\left(\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix} \right)=\begin{bmatrix}2x_1+x_3\\-4x_2\end{bmatrix} $$ 위 변환은 식 2와 같이 표준행렬 A에 의한 선형결합으로 나타낼 있습니다. \begin{align}\begin{bmatrix}2x_1+x_3\\-4x_2\end{bmatrix}&=\begin{bmatrix}2& 0& 1\\0& -4& 0\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}\\\Leftrightarrow &\; T=Ax \end{align} (식 2) 식 2의 성립여부는 동차시스템으로 전환한 상태에서 해의 존재를 결정하는 것으로 확인할 수 있습니다. A=np.array([[2,0,1],[0,-4,0]]) c=np.ze...

R caracas패키지를 이용한 극한, 미분, 적분 (R에서 sympy 사용하기)

symbol과 subs() 극한(limit)을 사용하여 자연상수 발견하기 미분과 적분 식으로 값 결정 caracas패키지를 이용한 극한, 미분, 적분 symbol과 subs() 문자 s1, s2 심벌(기호)로 선언하기 위해 def_sym() 를 사용합니다. 이 함수는 symbol() 함수와 같습니다. 그러나 그 사용은 약간의 차이가 있습니다. def_sym(s1, s2);s1 #s1, s2를 선언 [caracas]: s1 s2 [caracas]: s2 str(s1) List of 1 $ pyobj:s1 - attr(*, "class")= chr "caracas_symbol" s3 [caracas]: s1*s2 str(s3) #attr(*, "class")= chr "caracas_symbol" List of 1 $ pyobj:s1*s2 - attr(*, "class")= chr "caracas_symbol" subs() 함수는 기호를 다른 문자나 숫자로 대체합니다. subs(식 또는 심벌, 'caracas_symbol',대체할 문자 또는 숫자) 또는 subs('caracas_symbol',대체할 문자 또는 숫자) %>%: pipe operator는 R에서 동일한 데이터를 대상으로 연속으로 작업하게 해주는 연산자입니다. s4 %subs("s1", "u+v") %>% subs("s2", "u-v"); s4 [caracas]: (u - v)*(u + v) s5 [caracas]: 2 2 u - v tex(s5) [1] "u^{2} - v^{2}" as_expr(심벌 또는 기호로 구성된 함수): R의 expres...

Sympy를 사용한 극한(limit)

내용 limit() 함수 좌극한, 우극한 data4limit 극한 limit() 함수 limit()함수를 사용합니다. limit(식, 변수, 값) 이 함수의 각 인수는 다음과 같습니다. $$\underset{\text{변수} \to \text{값}}{\quad \text{limit} \quad }\text{식}$$ import numpy as np import pandas as pd from sympy import * 예 함수 f(x)=sin(x)와 $g(x)=\frac{\sin(x)}{x}$의 0으로의 극한을 계산합니다. x=symbols('x') f=sin(x) limit(f, x, 0) 0 g=sin(x)/x limit(g, x, 0 ) 1 극한이 정해진 수에 접근하는 경우 .subs() 메서드를 적용할 수 있습니다. ex=x**2/exp(x) limit(ex, x, 1000) $\quad\color{navy}{\scriptstyle \frac{1000000}{e^{1000}}}$ ex.subs(x, 1000) $\quad\color{navy}{\scriptstyle \frac{1000000}{e^{1000}}}$ 그러나 변수가 무한대로 접근하는 경우 .subs()를 적용할 수 없습니다. limit(ex, x, oo) 0 ex.subs(x, oo) NaN sympy의 Limit 클래스는전달되는 식의 계산이 평가되지 않은 상태로 반환됩니다. Limit((cos(x)-1)/x, x, 0) $\quad\color{navy}{\scriptstyle \lim_{x \to 0^+}\left(\frac{\cos{\left(x \right)} - 1}{x}\right)}$ 위 표현식을 평가하기 위해 .doit() 메서드가 적용됩니다. Limit((cos(x)-1)/x, x, 0).doit() 0 limit((cos(x)-1)/x, x, 0) 0 좌극한, 우극한 함...

정규분포 그리기

정규분포 (Normal Distribution) 평균이 $\mu$이고 표준편차 $\sigma$인 연속확률변수 x의 확률밀도함수가 다음과 같다면 정규분포를 따릅니다. $$f(x) = \frac{1}{\sigma \sqrt{2 \pi}}\exp\left(-\frac{1}{2}\left[\frac{x-\mu}{\sigma}\right]^2\right), \quad -\infty \lt x \lt \infty $$ import numpy as np import pandas as pd from sympy import * import matplotlib.pyplot as plt sympy를 사용 x,m,s=symbols('x, mu, sigma') fn=1/(s*sqrt(2*pi))*exp(-Rational(1,2)*((x-m)/s)**2) simplify(fn) $\frac{\sqrt{2} e^{- \frac{\left(\mu - x\right)^{2}}{2 \sigma^{2}}}}{2 \sqrt{\pi} \sigma}$ fig, ax=plt.subplots(1, 2, figsize=(15, 4)) a=np.linspace(-6, 6, 100) for j in [-2, 0, 2]: b=[float(fn.subs({x:i, m:j, s:1})) for i in a] ax[0].plot(a, b, label='['+r'$\mu:$'+str(j)+','+r'$\sigma:$'+str(1)+']') ax[0].legend(loc='best') ax[0].set_xlabel("x", size=12, weight="bold") ax[0].set_ylabel("f(x)", size=12, weight="bold") ax[0].spines['left'].set_pos...

Sympy 객체를 사용한 미분과 적분

내용 개요 sympy에 의한 미분 Sympy에 의한 적분 Sympy 객체를 사용한 미분과 적분 개요 모듈 듈 Sympy는 기호(symbol)로 이루어진 수학적 객체의 계산을 다룹니다. 즉, 일반적으로 사용하는 x, y 등과 같은 문자를 수학적 기호로 인식하여 수학식을 표현하는 수단을 제공합니다. 또한 sympy에서 ∞는 알파벳 소문자 o를 두번 연이어 표시하는 것으로 대체합니다. oo = ∞ 다음은 파이썬 코드와 모듈 math, sympy를 사용하여 제곱근을 계산한 결과를 나타낸 것입니다. import math from sympy import * 9**0.5 3.0 pow(9, 0.5) #파이썬 내장함수 3.0 math.sqrt(9) #모듈 math함수 3.0 sqrt(9) #sympy 함수 3 위 결과는 모두 실수로 반환됩니다. 그러나 8의 제곱근과 같이 근사값(무리수)이 반환되는 경우는 그 결과의 표현이 달라집니다. sympy를 사용할 경우 일반적으로 수학적으로 표현하는 방식으로 결과를 반환합니다. round(8**0.5,3) 2.828 round(pow(8, 0.5), 3) #파이썬 내장함수 2.828 round(math.sqrt(8), 3) #모듈 math함수 2.828 sqrt(8) #sympy 함수 $2 \sqrt{2}$ 위의 sympy에 의한 결과 $\sqrt{2}$는 기호입니다. 즉, sympy 객체는 실제 수와 함께 일정한 기호을 사용하기 때문에 다양한 수학적 표현이 가능합니다. sympy 모듈은 $\sqrt{2}$와 같은 자체적으로 지정된 기호외에 symbols() 함수를 사용하여 사용자가 사용하는 기호를 정의할 수 있습니다. x, y=symbols('x y') type(x) sympy.core.symbol.Symbol expr=x+2*y expr x + 2 y 위에서 expr 객체는 기호 x, y를 지닌 객체입니다....

적분방법

내용 부분적분 치환적분 적분방법 어떤 것을 적분하기 위해서는 그들을 적분할 수 있는 형태로 재구성하는 것으로부터 시작합니다. 이러한 재구성에는 다양한 방법들이 적용됩니다. 부분적분 식 1과 같이 미분의 곱법칙 을 적분에 적용할 수 있습니다. $$\begin{align}\tag{1}d(uv) &= u·dv + v·du\\ u·dv &= d(uv) - v·du\\ ∫u·dv &= \int d(uv) - \int v\,du\\ &= uv - ∫v·du + C\end{align}$$ 식 1에서 u는 정상함수, dv는 미분된 함수를 나타냅니다. 식 1은 식 2와 같이 부분적분 공식으로 정리할 수 있습니다. 부분적분 \begin{equation}\tag{2} \int {\large {[}}f(x)·g(x){\large {]}}dx = f(x) \int g(x)\, dx - \int \left[\frac{df(x)}{dx} \int g(x) \right] dx \end{equation} 부분 적분의 몇 가지 예제들을 계산해 봅니다. 예)   함수 w·sin(w)의 경우 직접 적분하기는 어렵지만 두 식의 곱으로 구성되어 있으므로 부분 적분을 적용할 수 있습니다. 즉, w를 원함수 u로 하고 sin(w)를 미분된 함수 dv라고 한다면 다음과 같이 전개할 수 있습니다. $$\begin{align} u = w,& \qquad \sin(w) = dv\\ \int \sin(w)\, dw &= -\cos(w)\\ &= v\\ \int w·\sin(w) \,dw &= w(-\cos(w)) - \int (-\cos(w))\, dw + C\\ &= -w·\cos(w) + \sin(w) + C \end{align}$$ 위 부분적분의 과정에 따라 코드를 작성해 보면 다음과 같습니다. import numpy a...

정적분(Definite Integral)

내용 정적분으로 면적 계산 극좌표에서의 면적 적분에 의한 부피 계산 정적분(Definite Integral) 정적분으로 면적 계산 곡선에 대한 적분 계산으로 면적을 계산할 수 있습니다. 그림 1은 식이 알려진 곡선으로 그 곡선 AB하의 PQNM의 면적을 계산해 봅니다. 그림 1. 곡선의 면적. 그림 1의 지정된 영역 PQNM의 면적은 그 구간 내에 포함된 매우 작은 부분들의 면적을 계산하여 모두 합하는 방식으로 계산될 수 있습니다. 그림 2는 밑면 dx, 높이 dy로서 영역 PQNM 내에 포함된 작은 부분을 나타낸 것으로 각 면적의 합이 지정된 영역의 총 면적이 됩니다. 그림 2. 영역의 부분에 대한 단면적. 위 그림의 면적을 평균 높이 y, 밑면의 길이 dx로 하는 사각형으로 계산할 수 있을까요? 평균 높이를 사용하므로 그림의 윗부분에서 존재하는 부분과 존재하지 않는 부분을 대칭 관계로 고려하면 그 면적을 dx·y로 간주할 수 있습니다. 더구나 dx를 매우 작게 감소시킨다면 대칭 관계로 가정한 부분에서 발생하는 오차가 매우 작아지기 때문에 실제 면적에 더욱 근접할 것입니다. 이 작은 부분의 1개의 면적을 dS로 한다면 다음과 같이 나타낼 수 있습니다. dS = y·dx 주어진 영역의 총면적은 식 1과 같이 부분 면적의 합으로 표현할 수 있습니다. $$\begin{equation}\tag{1} \text{총면적}\; S = \int dS = \int y\,dx \end{equation}$$ 그러므로 x로 구성된 y의 함수를 안다면 적분에 의해 위 계산을 실행할 수 있습니다. 예를 들어 지정된 영역의 곡선의 함수가 y = b + ax 2 라면 이 함수의 적분으로 총 면적을 계산할 수 있습니다. from sympy import * a, b, x=symbols("a, b, x") y=b+a*x**2 inty=integrate(y, x) inty $\quad \color{navy}{\frac{a x...

sympy 식과 연산

내용 symbols 등호 기호 ^, &, 그리고 / 기본 연산 대체(substitution) 문자열을 sympy 식으로 전환 evalf, N lambdify sympy operation symbols sympy에서 문자를 심벌로 사용하기 위해서는 사용전에 반드시 정의되어야 합니다. 심벌을 정의하기 위해 symbols() 를 사용하는데 여러개의 심벌들을 동시에 정의할 수 있습니다. from sympy import * x=symbols('x') x+1 x + 1 y, z=symbols('y z') type(y) sympy.core.symbol.Symbol 심벌은 문자열로 지정이 가능합니다. crazy =symbols('unrelated') crazy+1 unrelated + 1 symbols() 함수에 의해 정의한 일반 객체의 이름으로 사용된 문자와는 구분됩니다. 다음 코드에서 symbol로 정의된 x 즉, sympy 식에 사용된 심벌 x와 2가 할당된 객체 이름의 x와는 구분됨을 나타내고 있습니다. x= symbols('x') #심벌로 x expr=x+1 expr x + 1 x=2 #객체이름으로 x x + 3 5 sympy에서 생성한 식의 심벌에 특정한 수를 대입하기 위해서는 .subs() 메소드를 적용합니다. x=symbols('x') expr=x+1 expr x + 1 expr.subs(x, 4) 5 등호 기호 python에서 ' = '는 이 기호를 기준으로 오른쪽의 값을 왼쪽으로 할당함을 의미합니다. sympy 역시 동일한 의미로 작동됩니다. ' 같다 '의 의미로는 ‘ == ’를 사용하고 bool형 즉, True, False의 결과를 반환합니다. x=symbols('x') expr = x+1 expr==3 False expr1=expr.sub...

적분의 일반 규칙과 부정적분(Indefinite Integral)

내용 적분의 일반 규칙 함수들의 합에 대한 적분 함수의 상수항 특별한 함수의 적분 특별한 함수의 적분공식 삼각함수의 적분 편적분 적분 규칙 적분의 일반 규칙 함수 y에 대한 미분은 $\displaystyle \frac{dy}{dx}$를 계산하는 것입니다. 많은 수학적 계산과 같이 미분 과정 역시 역산될 수 있습니다. 예를 들어 $\displaystyle y = x^4$의 미분은 $\displaystyle \frac{dy}{dx} = 4x^3$이 되며 그 과정을 반대로 실행하면 원 함수인 $\displaystyle y = x^4$이 되어야 합니다. 그러나 미분계수가 $\displaystyle 4x^3$이 되는 함수는 위에서 언급한 함수 외에 $\displaystyle x^4 + C$와 같이 상수를 첨가된 다양한 함수의 미분 결과일 수 있습니다. 상수는 미분의 결과에 영향을 주지 않기 때문입니다. 이러한 점을 적분에 고려하여 미분의 역과정인 적분 결과에 상수 C를 더해 줍니다. $$\begin{align} \frac{dy}{dx}&=x^{n-1}\\ \int nx^{n-1}\; dx&= x^n+C\\ & C: 상수 \end{align}$$ 식 1과 같이 위의 관계에서 독립변수 x의 거듭제곱에 대한 미분과 적분의 일정한 관계가 성립됩니다. 적분일반규칙 $$\begin{align}\tag{1} \frac{dy}{dx}&=x^{n}\\ \int nx^{n}\; dx&= \frac{1}{n+1}x^{n+1}+C\\ & C: 상수,\; n \neq -1 \end{align}$$ 적분 계산은 sympy의 integrate() 함수를 적용합니다. 이 함수의 결과에는 상수가 고려되지 않습니다. 그러나 적분 결과로 대상인 함수에서의 상수의 존재 여부를 결정할 수 없기 때문에 상수가 존재한다고 간주해야 합니다. 그러므로 intergrate()함수에 의한 계...

편미분(Partial differential)

내용 편미분 결합함수의 편미분 편미분에 의한 극대와 극소 편미분 편미분 다음과 같이 하나 이상의 독립변수가 존재하는 경우의 종속변수는 모든 독립변수들 각각에 영향을 받습니다. 이러한 함수에서 종속변수의 변화는 각 독립변수의 변화에 대한 합으로 나타냅니다. 두 변수에 의한 함수의 경우 식 1과 같이 표현합니다. $$\begin{equation}\tag{1}y = f(u, v) \end{equation}$$ 식 1과 같이 두 독립변수로 구성된 함수의 미분은 각 독립변수에 대한 종속변수의 미분(변화율)으로 구성되며 이러한 미분을 편미분(partial differentiation) 이라 합니다. 편미분은 특정한 독립변수에 대해 실행할 경우 다른 독립변수를 상수로 간주하는 방식으로 이루어집니다. 그러므로 식1의 미분은 식 2와 같습니다. $$\begin{align}\tag{2} dy_v = v \cdot du\\ dy_u = u \cdot dv \end{align}$$ 식 2의 각 결과에서 아래첨자는 그 시행에서 상수로 간주되는 변수를 의미합니다. 이러한 편미분은 식 3과 같이 그리스 문자 $\partial$를 사용하여 다음과 같이 나타냅니다. $$\begin{align}\tag{3} \frac{\partial y}{\partial u}=v& \rightarrow dy_v = \frac{\partial y}{\partial u} \cdot du\\ \frac{\partial y}{\partial v}=u& \rightarrow dy_u = \frac{\partial y}{\partial v} \cdot dv \end{align}$$ 함수 y의 전체적인 미분은 각 편미분의 합으로 나타냅니다.(식 4) $$\begin{align}\tag{4} dy &= \frac{\partial y}{\partial u}du + \frac{\partial y}{\partial v} dv\\ ...

삼각함수의 미분

내용 sin, cos, tan의 미분 2차미분과 역함수 미분 삼각함수의 2차미분 sin, cos, tan 함수의 미분규칙 역함수의 미분 역삼각함수의 미분규칙 삼각함수(trigonometric functions)의 미분 sin, cos, tan의 미분 일반적으로 각을 표시하기 위해 그리스 문자 θ으로 사용합니다. 다음 함수를 고려해 봅니다. y = sin(θ) 이 함수에서 조사할 것은 그 함수의 변화량 (미분 계수) $\frac{d(\sin(\theta))}{d\theta}$ 입니다. 즉, 각도 θ와 sin(θ)의 변화 사이의 관계를 찾는 것입니다. 특히 증가가 무한히 작을 경우가 주된 관심 사항입니다. 이러한 관계를 그림 1에 나타내었습니다. import numpy as np import pandas as pd from sympy import * import matplotlib.pyplot as plt plt.figure(figsize=(5, 5)) a=plt.axes(xlim=(-1.5, 2.5), ylim=(-1.5, 2.5)) r=plt.Circle((0, 0), 1, facecolor="none", edgecolor="navy", linewidth=2, label="radius=r") a.add_patch(r) plt.arrow(0, 0, 0.8, np.sqrt(1-(-0.8)**2), color="green", label=r"$\mathbf{degree=\theta}}$") plt.arrow(0, 0, 0.7, np.sqrt(1-(-0.7)**2), color="red", label=r"$\mathbf{degree=\theta+\Delta\theta}}$") plt.hlines(0, -1.5, 1.5, color="black") plt.vlines(0, -1.5, 1.5, co...