使用 LsqFit(或其他方法)自动找到 x 轴的比例因子?
Automatically find the scaling factor of the x-axis using LsqFit (or other method)?
我有以下数据:一个向量 B
和一个向量 R
。向量 B
是 "independent" 变量。对于这一对,我有两个数据集:一个是 Bex, Rex
的实验测量,另一个是我制作的模拟 Bsim, Rsim
。模拟没有任何 x 轴的 "scale"(B
向量)。因此,当我试图使我的曲线适合实验时,我必须找出一个缩放参数 B0
"by eye",然后用这个数字 B0
我乘以整个 Bsim
矢量和简单 plot(Bsim, Rsim, Bex, Rex)
。
我想使用程序包 LsqFit
来使程序自动化并更准确。但是,我无法理解如何使用它来找到自变量的缩放比例。
我的第一个想法是 "invert" B
和 R
的角色。但是,我认为有两个问题让事情变得更糟:1) R
curve/data 并不单调,2) 实验数据要多得多 "dense"(他们有更多的数据点: 我的模拟总共有120个点,实验有几千个)。
下面我举个例子,如果我想完成什么(当然,答案不需要使用LsqFit
)。我还附上两张图,非常清楚地展示了一切。
#= stuff happened before this point =#
Bsim, Rsim = load(simulation)
Bex, Rex = load(experiment)
#this is what I want to do:
some_model(x, p) = ???
fit = curve_fit(some_model, Bex, Rex, [3.5])
B0 = fit.param[1]
#this is what I currently do by trail and error:
B0 = 3.85 #this is what I currently do by trial and error
plot(B0*Bsim, Rsim, Bex, Rex)
P.S.: R
曲线(因变量)均按其最大值归一化,因为它们的比例并不重要。
一种简单的方法 iff 你总是可以期望你的实验和模拟都具有一个高峰,并且你确定只有一个比例因子而不是一个偏移量,就是简单地将 Bsim
向量乘以 mode_rex / mode_rsim
(例如,在您的示例中,mode_rsim
= 1,并且 mode_rex
= 4,因此将 Bsim
乘以 4 .但我相信你已经想到了。
对于更通用的方法,一种方法如下:
- 添加和加载插值包
- 创建一个网格进行插值,例如
Grid = 0:0.01:Bex[end]
在该网格上插入 Rex
,例如
RexInterp = interpolate( (Bex,), Rex, Gridded(Linear()));
RexGridVec = RexInterp[Grid];
在同一网格上插入 Rsim
,但是 在 Bsim "knots" 上引入乘数,例如
Multiplier = 0.1;
RsimInterp = interpolate( (Multiplier * Bsim,), Rsim, Gridded(Linear()));
RsimGridVec = RsimInterp[Grid]
现在可以计算RsimGridVec
和RexGridVec
之间的平方误差值,例如
SqErr = sum((RsimGridVec - RexGridVec).^2)
如果你遵循这个技巧,那么如果你为一个乘数范围(比如 0:0.01:10)创建一个循环,并得到与每个乘数相关的平方误差,你可以找出乘数其中平方误差最小。
理论上,如果您也想找到特定偏移量的最佳值,则可以将其作为一系列偏移量的外循环。请注意,这是一种蛮力方法,但根据图表中的向量判断它是相当有效的。
我有以下数据:一个向量 B
和一个向量 R
。向量 B
是 "independent" 变量。对于这一对,我有两个数据集:一个是 Bex, Rex
的实验测量,另一个是我制作的模拟 Bsim, Rsim
。模拟没有任何 x 轴的 "scale"(B
向量)。因此,当我试图使我的曲线适合实验时,我必须找出一个缩放参数 B0
"by eye",然后用这个数字 B0
我乘以整个 Bsim
矢量和简单 plot(Bsim, Rsim, Bex, Rex)
。
我想使用程序包 LsqFit
来使程序自动化并更准确。但是,我无法理解如何使用它来找到自变量的缩放比例。
我的第一个想法是 "invert" B
和 R
的角色。但是,我认为有两个问题让事情变得更糟:1) R
curve/data 并不单调,2) 实验数据要多得多 "dense"(他们有更多的数据点: 我的模拟总共有120个点,实验有几千个)。
下面我举个例子,如果我想完成什么(当然,答案不需要使用LsqFit
)。我还附上两张图,非常清楚地展示了一切。
#= stuff happened before this point =#
Bsim, Rsim = load(simulation)
Bex, Rex = load(experiment)
#this is what I want to do:
some_model(x, p) = ???
fit = curve_fit(some_model, Bex, Rex, [3.5])
B0 = fit.param[1]
#this is what I currently do by trail and error:
B0 = 3.85 #this is what I currently do by trial and error
plot(B0*Bsim, Rsim, Bex, Rex)
P.S.: R
曲线(因变量)均按其最大值归一化,因为它们的比例并不重要。
一种简单的方法 iff 你总是可以期望你的实验和模拟都具有一个高峰,并且你确定只有一个比例因子而不是一个偏移量,就是简单地将 Bsim
向量乘以 mode_rex / mode_rsim
(例如,在您的示例中,mode_rsim
= 1,并且 mode_rex
= 4,因此将 Bsim
乘以 4 .但我相信你已经想到了。
对于更通用的方法,一种方法如下:
- 添加和加载插值包
- 创建一个网格进行插值,例如
Grid = 0:0.01:Bex[end]
在该网格上插入
Rex
,例如RexInterp = interpolate( (Bex,), Rex, Gridded(Linear())); RexGridVec = RexInterp[Grid];
在同一网格上插入
Rsim
,但是 在 Bsim "knots" 上引入乘数,例如Multiplier = 0.1; RsimInterp = interpolate( (Multiplier * Bsim,), Rsim, Gridded(Linear())); RsimGridVec = RsimInterp[Grid]
现在可以计算
RsimGridVec
和RexGridVec
之间的平方误差值,例如SqErr = sum((RsimGridVec - RexGridVec).^2)
如果你遵循这个技巧,那么如果你为一个乘数范围(比如 0:0.01:10)创建一个循环,并得到与每个乘数相关的平方误差,你可以找出乘数其中平方误差最小。
理论上,如果您也想找到特定偏移量的最佳值,则可以将其作为一系列偏移量的外循环。请注意,这是一种蛮力方法,但根据图表中的向量判断它是相当有效的。