This is my notes from reading solitaryroad.com documents. I wanted to focus on programming geometrical functions and symbolic math derivations. But eventually I realized I have missed out many important concepts. R programming may or may not be a good way of doing these. I am a reader, I have no choice.
In the x-y plan, a curve is defined by function or vector. We want the differential form of arc length. Let \(s\) be arc length.
For curve \(y=f(x)\), we have \[\frac{ds}{dx}=\sqrt{1+\left(\frac{dy}{dx}\right)^2}\]
#y=f(x), y is a curve
dsdx<- function(inn="dy/dx"){#inn: dydx
formula = paste0("sqrt(1+(",inn,")^2)")
return(formula)
}
dsdx("3x^2")
## [1] "sqrt(1+(3x^2)^2)"
dsdx()
## [1] "sqrt(1+(dy/dx)^2)"
For curve \(\{x(u),y(u)\}\), we have \[\frac{ds}{du}=\sqrt{\left(\frac{dx}{du}\right)^2+\left(\frac{dy}{du}\right)^2}\]
#x=f(u),y=g(u)
dsdu<- function(inn1="dx/du",inn2="dy/du"){#inn1: dxdu, inn2: dydu
formula = paste0("sqrt((",inn1,")^2+(",inn2,")^2)")
return(formula)
}
dsdu()
## [1] "sqrt((dx/du)^2+(dy/du)^2)"
The arc length \(s\) is also called length of a curve. When we want to compute \(s\), we use some very small length \(ds\) from the differential form \[ds=\frac{ds}{du}du\] And then sum the small \(ds\) together to get curve length \(s\), it is called an integral \[s=\int ds\]
In the x-y plan, a curve \(y=f(x)\) has curvature \[K =\frac{\frac{d^2y}{dx^2}}{\left[1+\left(\frac{dy}{dx}\right)^2\right]^{\frac{3}{2}}}\] For \(dy/dx\) is infinity, alternatively \[K =\frac{\frac{d^2x}{dy^2}}{\left[1+\left(\frac{dx}{dy}\right)^2\right]^{\frac{3}{2}}}\]
K <- function(inn1="dy/dx",inn2="d^2y/dx^2"){
formula = paste0("(",inn2,")/(1+(",inn1,")^2)^(3/2)")
return(formula)
}
K()
## [1] "(d^2y/dx^2)/(1+(dy/dx)^2)^(3/2)"
#for dy/dx is infinity, use inn1="dx/dy",inn2="d^2x/dy^2"
Find curvature at point \((1,1)\) for curve \(y=x^3\)
require(Deriv)
## Loading required package: Deriv
## Warning: package 'Deriv' was built under R version 4.0.5
curve="x^3"
dydx=Deriv(curve,"x")#1st derivative
d2ydx2=Deriv(dydx,"x")#2nd derivative
myexp=K(dydx,d2ydx2) #my expression
x=1
eval(parse(text=myexp))
## [1] 0.1897367
\[\frac{1}{radius}\]
K_circle <- function(inn="radius"){
return(paste0("1/",inn))
}
K_circle()
## [1] "1/radius"
myexp=K_circle("R") #my expression
R=5#meters
eval(parse(text=myexp))#0.2 radian per meter
## [1] 0.2
\[\frac{1}{|curvature|}\]
Radius_of_curvature <- function(inn="curvature"){
return(paste0("1/abs(",inn,")"))
}
Radius_of_curvature()
## [1] "1/abs(curvature)"
myexp=Radius_of_curvature("K") #my expression
K=0.2#radian/meter
eval(parse(text=myexp))#5 meters
## [1] 5
Draw a circle to fit curvature at point P.
\[\alpha=x-\frac{\frac{dy}{dx}\left [1+\left (\frac{dy}{dx}\right)^2\right]}{\frac{d^2y}{dx^2}},\beta=y+\frac{1+\left (\frac{dy}{dx}\right)^2}{\frac{d^2y}{dx^2}}\]
\[\alpha=x+\frac{1+\left (\frac{dx}{dy}\right)^2}{\frac{d^2x}{dy^2}},\beta=y-\frac{\frac{dx}{dy}\left [1+\left (\frac{dx}{dy}\right)^2\right]}{\frac{d^2x}{dy^2}}\]
K_circle_center <- function(inn1="dy/dx",inn2="d^2y/dx^2",x="x",y="y"){
alpha=paste0(x,"-",inn1,"*(1+(",inn1,")^2)/",inn2)
beta =paste0(y,"+(1+(",inn1,")^2)/",inn2)
return(paste0("c(",alpha,",",beta,")"))
}
#for dy/dx is infinity, use inn1="dx/dy",inn2="d^2x/dy^2"
K_circle_center2 <- function(inn1="dx/dy",inn2="d^2x/dy^2",x="x",y="y"){
beta=paste0(y,"-",inn1,"*(1+(",inn1,")^2)/",inn2)
alpha =paste0(x,"+(1+(",inn1,")^2)/",inn2)
return(paste0("c(",alpha,",",beta,")"))
}
K_circle_center()
## [1] "c(x-dy/dx*(1+(dy/dx)^2)/d^2y/dx^2,y+(1+(dy/dx)^2)/d^2y/dx^2)"
K_circle_center2()
## [1] "c(x+(1+(dx/dy)^2)/d^2x/dy^2,y-dx/dy*(1+(dx/dy)^2)/d^2x/dy^2)"
curve="x^3"
dydx=Deriv(curve,"x")#1st derivative
d2ydx2=Deriv(dydx,"x")#2nd derivative
myexp=K_circle_center(dydx,d2ydx2,1,1) #my expression
eval(parse(text=myexp))
## [1] -4.000000 2.666667
The centers of curvature circle of a given curve.