Julia 使用LsqFit(或其他方法)自动查找x轴的比例因子?

Julia 使用LsqFit(或其他方法)自动查找x轴的比例因子?,julia,curve-fitting,least-squares,data-fitting,Julia,Curve Fitting,Least Squares,Data Fitting,我有以下数据:向量B和向量R。向量B是“独立”变量。对于这一对,我有两个数据集:一个是对Bex,Rex的实验测量,另一个是由meBsim,Rsim生成的模拟。模拟没有x轴的任何“比例”(即B矢量)。因此,当我试图将我的曲线拟合到实验中时,我必须“用眼睛”找出一个缩放参数B0,然后用这个数字B0乘以整个Bsim向量,然后简单地绘图(Bsim,Rsim,Bex,Rex) 我想使用包LsqFit使程序自动化,更准确。然而,我很难理解如何使用它来找到自变量的标度 我的第一个想法是“颠倒”B和R的角色。然

我有以下数据:向量
B
和向量
R
。向量
B
是“独立”变量。对于这一对,我有两个数据集:一个是对Bex,Rex的实验测量,另一个是由me
Bsim,Rsim
生成的模拟。模拟没有x轴的任何“比例”(即
B
矢量)。因此,当我试图将我的曲线拟合到实验中时,我必须“用眼睛”找出一个缩放参数
B0
,然后用这个数字
B0
乘以整个
Bsim
向量,然后简单地
绘图(Bsim,Rsim,Bex,Rex)

我想使用包
LsqFit
使程序自动化,更准确。然而,我很难理解如何使用它来找到自变量的标度

我的第一个想法是“颠倒”
B
R
的角色。然而,我认为有两个问题让事情变得更糟:1)曲线/数据不是单调的,2)实验数据更“密集”(数据点更多:我的模拟总共有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)
注:
R
曲线(因变量)均通过其最大值进行标准化,因为其标度并不重要。
一种简单的方法iff你可以期望你的实验和模拟都有一个高峰,你可以确定只有一个比例因子而不是一个偏移量,就是简单地将你的
Bsim
向量乘以
mode\u rex/mode\rsim
(例如,在您的示例中,
mode\u rsim
=1,
mode\u rex
=4,所以将
Bsim
乘以4。但我相信您已经想到了这一点

对于更一般的方法,一种方法如下:

  • 添加和加载插值包
  • 创建要在其上插值的栅格,例如,
    grid=0:0.01:Bex[end]
  • 在该网格上插入
    Rex
    ,例如

    RexInterp = interpolate( (Bex,), Rex, Gridded(Linear())); 
    RexGridVec = RexInterp[Grid];
    
  • 在同一网格上插值
    Rsim
    ,但在Bsim“节点”上引入乘数,例如

  • 现在,您可以计算
    RsimGridVec
    RexGridVec
    之间的平方误差值,例如

    SqErr = sum((RsimGridVec - RexGridVec).^2)
    
如果您遵循此技术,那么如果您为乘法器范围(例如0:0.01:10)创建一个循环,并获得与每个乘法器关联的平方误差,您可以找到平方误差最小的乘法器

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

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