직접 미분식을 만들어 사용

> fd = function(f,x, h=x*sqrt(.Machine$double.eps)){# 작은 h
+   return((f(x+h)-f(x))/h) #전진차분
+ }
> 
> f= function(x){
+   return(-x^2+6*x-6)
+ }
> 
> fd(f,2, h=1)
[1] 1
> 
> curve(f,1,5)#함수f에서서 구간[1,5]
curve(f,1,5)#함수f에서서 구간[1,5]

D함수로 미분

> fx = expression(-x^2 + 6*x - 6)
> dfx = D(fx, 'x')
> dfx
6 - 2 * x
> f = function(x) eval(c(dfx)[[1]])
> f(3)
[1] 0

-expression은 함수를 만든거고
-D함수는 미분
- eval() 함수는 표현식을 평가하여 그 값을 계산합니다. 따라서 c(dfx)는 미분한 결과를 담은 벡터를 반환하고, eval(c(dfx))는 이를 평가하여 결과를 반환합니다. 여기서 [[1]]은 결과 벡터에서 첫 번째 값을 선택하는 것입니다.(chat gpt에서 가져옴)
 
적분(integrate 함수)

> #적분
> fx=function(x){
+   1/((x+1)*sqrt(x))
+ }
> integrate(fx, lower =0 , upper = Inf)#D함수랑 비슷슷
3.141593 with absolute error < 2.7e-05

 
여러개의 직사각형을 활용하여 적분하기(직사각형법)
-a에서b의 넓이는

> fx=function(x){
+   return(x^4-10*x^3+15*x^2-6*x+10)
+ }
> curve(fx)
> 
> integr_by_you=function(a,b,n){
+   sum=0#처음에는 0으로
+   
+   h=(b-a)/n#전체구간(1-0)을 n개로 나누면 직사각형 밑변의 길이 산출
+   
+   for (i in 1:n) {sum = sum+h*fx(a+i*h)#오른쪽 직사각형으로 가면서 높이(f(x))와 h를 곱해가며 더함함
+     
+   }
+   return(sum)
+ }
> 
> integr_by_you(0,1,10)
[1] 9.70333
> integrate(fx,0,1)#윗 값가 거의 비슷하다다
9.7 with absolute error < 1.1e-13
curve(fx)

시뮬레이션을 활용한 수치 적분 소개

> fx=function(x) x^2
> integrate(fx,-2,2)
5.333333 with absolute error < 5.9e-14
> #위와 같은 방식으로
> set.seed(132) #이 함수를 호출하면 이후에 생성되는 난수는 132에서부터 시작하여 동일한 순서로 생성됩니다.
> a=-2
> b=2
> c=0
> d=4
> n=10^5
> 
> x= runif(n,a,b)
#"x = runif(n, a, b)는 n개의 난수를 생성하고,
#이를 [a, b] 범위의 균일 분포에서 생성하여 x에 할당하는 것을 의미합니다.
> y= runif(n,c,d)
> 
> temp= sum(y<fx(x))
> 16*temp
[1] 532832

#temp는 y < fx(x)를 만족하는 경우의 수를 합산한 것입니다.
#즉, fx(x)의 값보다 y 값이 작은 경우의 수를 셉니다.

#그런 다음 16 * temp는 해당 영역의 근사치를 계산합니다.
#이 경우 16은 x의 범위가 -2에서 2까지이기 때문에 해당 영역의 넓이를 계산하기 위해 사용됩니다.
#temp는 이 영역에 속하는 균일한 무작위 점의 비율을 나타내므로,
#이를 영역의 넓이에 곱하여 전체 영역에 대한 근사치를 계산합니다//

'Language > R' 카테고리의 다른 글

선형회귀  (1) 2024.04.22
선형대수  (0) 2024.04.21
함수와 프로그래밍  (1) 2024.04.21
R의 기초  (1) 2024.04.20

+ Recent posts