У меня есть две кривые с одинаковым количеством точек, заполненные с использованием приблизительной функции, для значений x и y отдельно для каждой кривой. Значения осей x и y являются логарифмическими, поэтому при аппроксимации и интерполяции я возвращаюсь к обычной десятичной шкале. Черная и синяя линии являются исходными линиями, а красная интерполирована между ними. Как видите, красная линия не имитирует изгиб с правой стороны, так как интерполяция выполняется на основе предположения, что каждая пара x и y является ближайшей.
Есть ли способ выполнить интерполяцию между кривыми в R на основе реальных ближайших точек между ними? Может быть, существуют алгоритмы для этого? Что угодно было бы полезно, так как я не уверен, как это называется в математике.
base="ftp://cdsarc.u-strasbg.fr/pub/cats/J/A+A/508/355/ms/"
setwd("~/Desktop")
file1=paste(base,"z001y23_1.60.dat",sep="")
file2=paste(base,"z001y23_1.70.dat",sep="")
cols=c("no","age","logL","logTef", "grav","stage")
ncol <- length(count.fields(file=file1, sep = ","))
second=read.table(file=file1,fill=T, blank.lines.skip=F, skip=2, header=F, strip.white=T, col.names = paste("V", seq_len(ncol)))
second$V.6<-second$V.23
colnames(second) <-cols
second$logL=as.numeric(second$logL)
#performing some filtering of data here
pos1=which(second$stage == "trgb")[1]
second=second[1:pos1,]
ncol <- length(count.fields(file=file2, sep = ","))
first=read.table(file=file2,fill=T, blank.lines.skip=F, skip=2, header=F, strip.white=T, col.names = paste("V", seq_len(ncol)))
first$V.6<-first$V.23
colnames(first) <-cols
#performing some filtering of data here
pos2=which(first$stage == "trgb")[1]
first=first[1:pos2,]
#plotting data
len=max(c(min(first[[4]]),min(second[[4]])))
first=first[first[[4]]>len,]
second=second[second[[4]]>len,]
plot(second[[4]],second[[3]],t="l",xlim=rev(range(second[[4]])),xlab="x",ylab="y")
lines(first[[4]],first[[3]],t="l",col="blue")
n=max(c(length(second[[4]]),length(first[[4]])))
#approximating missing points
xf1 <- approx(10^second[[4]],n=n)
yf1 <- approx(10^second[[3]],n=n)
xf2 <- approx(10^first[[4]],n=n)
yf2 <- approx(10^first[[3]],n=n)
#calculating interpolated line
ratio=2
s1<-log10((xf1$y-xf2$y)/ratio+xf2$y)
s2<-log10((yf1$y-yf2$y)/ratio+yf2$y)
lines(s1,s2, col ="red")