我在mathoverflow上发布了这个问题,但我想知道你对此的看法.我想要做的是绘制一条曲线,该曲线始终与给定曲线的法线相距一定距离.我知道给定曲线的公式(分段三次样条).问题似乎是当偏差距离大于曲线半径时 - 这些点会被扰乱.有谁遇到过这样的问题.有一个很好的解决方案吗?
谢谢你的任何想法,
尤利安
后来:巫师先生在下面详细描述了这个问题.
所以我有一组特殊的三次样条曲线,它的2d控制点总是会产生一条永远不会在x轴上交叉的曲线.也就是说,曲线看起来像是简单的多项式函数,使得y = f(x).我想有效地创建一个沿样条曲线的y坐标数组,这些坐标对应于运行样条线段长度的均匀间隔的x坐标.
我想有效地找到与Y沿花键坐标,其中,例如,X = 0.0,X = 0.1,X = 0.2,等,或接近的另一种方式,有效地变换˚F 的x,y(吨)风格的函数成f(x)函数.
我目前使用4x4常数矩阵和4个2d控制点来描述样条曲线,使用Hermite或Catmull-Rom样条曲线的矩阵常数,并将它们插入从0到1 的t的三次函数.
给定矩阵和控制点,在x轴上获得这些y值的最佳方法是什么?
编辑:我应该补充说,一个足够好的近似值就足够了.
我知道平滑参数(lambda)对于拟合平滑样条非常重要,但是我没有看到关于如何选择合理的lambda(spar =?)的任何帖子,我被告知spar通常在0到1之间有没有人可以在使用smooth.spline()时分享你的经验?谢谢.
smooth.spline(x, y = NULL, w = NULL, df, spar = NULL,
cv = FALSE, all.knots = FALSE, nknots = NULL,
keep.data = TRUE, df.offset = 0, penalty = 1,
control.spar = list(), tol = 1e-6 * IQR(x))
Run Code Online (Sandbox Code Playgroud) 我正在使用UnivariateSpline为我拥有的某些数据构建分段多项式.然后我想在其他程序中使用这些样条(在C或FORTRAN中),因此我想了解生成样条函数背后的等式.
这是我的代码:
import numpy as np
import scipy as sp
from scipy.interpolate import UnivariateSpline
import matplotlib.pyplot as plt
import bisect
data = np.loadtxt('test_C12H26.dat')
Tmid = 800.0
print "Tmid", Tmid
nmid = bisect.bisect(data[:,0],Tmid)
fig = plt.figure()
plt.plot(data[:,0], data[:,7],ls='',marker='o',markevery=20)
npts = len(data[:,0])
#print "npts", npts
w = np.ones(npts)
w[0] = 100
w[nmid] = 100
w[npts-1] = 100
spline1 = UnivariateSpline(data[:nmid,0],data[:nmid,7],s=1,w=w[:nmid])
coeffs = spline1.get_coeffs()
print coeffs
print spline1.get_knots()
print spline1.get_residual()
print coeffs[0] + coeffs[1] * (data[0,0] - data[0,0]) \
+ coeffs[2] * (data[0,0] …Run Code Online (Sandbox Code Playgroud) 我现在已经在互联网上搜索了一个小时没能成功,在我的生活中,我找不到splinefun使用时method='fmm'(如Forsythe,Malcolm和Moler的方法)样条曲线如何完全适合一组点的解释.我知道以下内容:
拟合具有N个节点的三次样条是(N-1)*4个未知数的问题.通过假设样条在结处是平滑的(精确地说:它的一阶和二阶导数是连续的),假设样条经过所有结和(N-2)*2条件,得到(N-1)*2个等式.这留下了两个条件来确定样条曲线.通过假设二阶导数在端点处为零来找到自然立方.但fmm确实有所不同.据我所知,它适合一个精确的立方体到一个结的子集(这个结?)然后在样条上强加这个立方的某些导数(这些导数在哪里评估?).
我觉得这是一个简单的问题......
你如何识别图中的坐标?我绘制了一些数据,使用unireg(uniReg包)制作样条曲线,并想从一个点中提取数据.
library(uniReg)
P0mM <- read.table(text="
Time FeuM
0.04 138.8181818
7 1258.636364
14 1320.545455
21 2110.37037
28 13730.37037
35 1550.909091",header=TRUE)
z=seq(min(P0mM$Time),max(P0mM$Time),length=201)
uf=with(P0mM,unireg(Time,FeuM,g=5,sigma=1))
plot(FeuM~Time,P0mM,ylim=c(0,16000),ylab="Fe2+ uM", xlab="Time", main="0mM P")
lines(z,uf$unimod.func(z))
Run Code Online (Sandbox Code Playgroud)

我能够找到曲线的最大y值(即14444)
max((uf$unimod.func(z)))
Run Code Online (Sandbox Code Playgroud)
我想确定x轴在哪里发生.(应该是30左右,但我想确切).
你怎么做到这一点?
谢谢!
我有一个格式如下的串行数据:
time milk Animal_ID
30 25.6 1
31 27.2 1
32 24.4 1
33 17.4 1
34 33.6 1
35 25.4 1
33 29.4 2
34 25.4 2
35 24.7 2
36 27.4 2
37 22.4 2
80 24.6 3
81 24.5 3
82 23.5 3
83 25.5 3
84 24.4 3
85 23.4 3
. . .
Run Code Online (Sandbox Code Playgroud)
一般来说,300只动物在短时间内的不同时间点有牛奶记录.但是,如果我们将他们的数据加在一起并且不关心不同的animal_ID,我们会在这样的牛奶〜时间之间产生一条曲线,如下图所示:
此外,在上图中,我们有1例动物的数据,它们很短且变化很大.我的目的是平滑每个动物数据,但如果模型允许从整个数据中学习一般模式,那么它就会被包括在内.我使用了以下格式的不同平滑模型(ns,bs,smooth.spline)但它只是不起作用:
mod <- lme(milk ~ bs(time, df=3), data=dat, random = ~1|Animal_ID)
Run Code Online (Sandbox Code Playgroud)
我希望如果有人已经处理过这个问题会给我一个建议.谢谢完整的数据集可以从这里访问:https: //www.dropbox.com/s/z9b5teh3su87uu7/dat.txt?dl=0
我正在使用R中的mgcv包来通过以下方法将一些多项式样条拟合到某些数据:
x.gam <- gam(cts ~ s(time, bs = "ad"), data = x.dd,
family = poisson(link = "log"))
Run Code Online (Sandbox Code Playgroud)
我正在尝试提取拟合的功能形式.x.gam是一个gamObject,我一直在阅读文档,但没有找到足够的信息,以手动重建拟合函数.
x.gam$smooth 包含有关是否已放置结的信息;x.gam$coefficients 给出样条系数,但我不知道使用什么顺序多项式样条并且在代码中查找没有透露任何内容.有没有一种简洁的方法来提取结,系数和使用的基础,以便人们可以手动重建拟合?
我想绘制一个受限制的三次样条曲线作为主图,并添加一个盒子和须状图来显示X变量的变化.然而,下铰链(x = 42),中间(x = 51)和上铰链(x = 61)与主曲线的相应网格线不完全吻合.
library(Hmisc)
library(rms)
library(ggplot2)
library(gridExtra)
data(pbc)
d <- pbc
rm(pbc)
d$status <- ifelse(d$status != 0, 1, 0)
dd = datadist(d)
options(datadist='dd')
f <- cph(Surv(time, status) ~ rcs(age, 4), data=d)
p <- Predict(f, fun=exp)
df <- data.frame(age=p$age, yhat=p$yhat, lower=p$lower, upper=p$upper)
### 1st PLOT: main plot
(g <- ggplot(data=df, aes(x=age, y=yhat)) + geom_line(size=1))
# CI
(g <- g + geom_ribbon(data=df, aes(ymin=lower, ymax=upper), alpha=0.5, linetype=0, fill='#FFC000'))
# white background
(g <- g + theme_bw())
# X-axis
(breaks …Run Code Online (Sandbox Code Playgroud) 我想显示一个由创建的图,geom_smooth()但是对我来说,能够描述如何创建该图很重要。
我可以从文档中看到,当n> = 1000时,使用gam作为平滑函数,但是我看不到使用了多少个结或使用哪个函数生成了平滑。
例:
library(ggplot2)
set.seed(12345)
n <- 3000
x1 <- seq(0, 4*pi,, n)
x2 <- runif(n)
x3 <- rnorm(n)
lp <- 2*sin(2* x1)+3*x2 + 3*x3
p <- 1/(1+exp(-lp))
y <- ifelse(p > 0.5, 1, 0)
df <- data.frame(x1, x2, x3, y)
# default plot
ggplot(df, aes(x = x1, y = y)) +
geom_smooth()
# specify method='gam'
# linear
ggplot(df, aes(x = x1, y = y)) +
geom_smooth(method = 'gam')
# specify gam and splines
# Shows …Run Code Online (Sandbox Code Playgroud)