使用 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" BR 的角色。但是,我认为有两个问题让事情变得更糟: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]
    
  • 现在可以计算RsimGridVecRexGridVec之间的平方误差值,例如

    SqErr = sum((RsimGridVec - RexGridVec).^2)
    

如果你遵循这个技巧,那么如果你为一个乘数范围(比如 0:0.01:10)创建一个循环,并得到与每个乘数相关的平方误差,你可以找出乘数其中平方误差最小。

理论上,如果您也想找到特定偏移量的最佳值,则可以将其作为一系列偏移量的外循环。请注意,这是一种蛮力方法,但根据图表中的向量判断它是相当有效的。