Math 数学题:缩放一个图形,使其与另一个匹配

Math 数学题:缩放一个图形,使其与另一个匹配,math,Math,我有两个值表,希望缩放第一个表,使其与第二个表尽可能匹配。两者长度相同。如果两者都以图表的形式绘制,它们应该尽可能彼此接近。但我不想要二次的,而是简单的线性权重。 我的问题是,由于Abs函数,我不知道如何实际计算最佳比例因子 一些伪代码: //given: float[] table1= ...; float[] table2= ...; //wanted: float factor= ???; // I have no idea how to compute this float rema

我有两个值表,希望缩放第一个表,使其与第二个表尽可能匹配。两者长度相同。如果两者都以图表的形式绘制,它们应该尽可能彼此接近。但我不想要二次的,而是简单的线性权重。 我的问题是,由于Abs函数,我不知道如何实际计算最佳比例因子

一些伪代码:

//given:
float[] table1= ...;
float[] table2= ...;

//wanted:
float factor= ???; // I have no idea how to compute this

float remainingDifference=0;
for(int i=0; i<length; i++)
{
    float scaledValue=table1[i] * factor;
    //Sum up the differences. I use the Abs function because negative differences are differences too.
    remainingDifference += Abs(scaledValue - table2[i]);
}
//给定:
浮动[]表1=。。。;
浮动[]表2=。。。;
//通缉:
浮动系数=???;//我不知道怎么计算这个
浮动剩余差=0;

对于(inti=0;i简单的线性权重很难像你说的那样

a_n = first sequence
b_n = second sequence
c = scaling factor
残差函数为(总和从i=1到N,点数):

采用与c收益率相关的衍生工具:

  d/dc SUM( |a_i - c*b_i| )
= SUM( b_i * (a_i - c*b_i)/|a_i - c*b_i| )
设置为
0
并求解
c
很难。我认为没有一种分析方法可以做到这一点。你可能想看看他们是否有什么好主意

但是,如果使用二次权重,它会变得非常简单:

  d/dc SUM( (a_i - c*b_i)^2 )
= SUM( 2*(a_i - c*b_i)* -c )
= -2c * SUM( a_i - c*b_i ) = 0
=> SUM(a_i) - c*SUM(b_i) = 0
=> c = SUM(a_i) / SUM(b_i)

如果可以的话,我强烈建议采用后一种方法。

简单的线性权重很难像你说的那样

a_n = first sequence
b_n = second sequence
c = scaling factor
残差函数为(总和从i=1到N,点数):

采用与c收益率相关的衍生工具:

  d/dc SUM( |a_i - c*b_i| )
= SUM( b_i * (a_i - c*b_i)/|a_i - c*b_i| )
设置为
0
并求解
c
很难。我认为没有一种分析方法可以做到这一点。你可能想看看他们是否有什么好主意

但是,如果使用二次权重,它会变得非常简单:

  d/dc SUM( (a_i - c*b_i)^2 )
= SUM( 2*(a_i - c*b_i)* -c )
= -2c * SUM( a_i - c*b_i ) = 0
=> SUM(a_i) - c*SUM(b_i) = 0
=> c = SUM(a_i) / SUM(b_i)

如果可以的话,我强烈建议采用后一种方法。

我建议在牛顿·拉斐逊身上尝试某种变体

构造一个函数Diff(k),用于查看固定标记a和B之间两个图形的面积差异

从数学上来说,我猜它是积分(x=A到B){f(x)-k*g(x)}dx

不管怎样,实际上你可以减去这些值

比如,如果你的范围从X=-10到10,在[-10,10]中的每个整数i上都有一个f(i)和g(i)的数据点(即21个数据点)

然后求和(i=-10到10){f(i)-k*g(i)}

基本上,你会期望这个函数看起来像一条抛物线——会有一个最佳的k,在任何一个方向稍微偏离它都会增加总的面积差

差别越大,你就会期望差距越大

因此,这应该是一个非常平滑的函数(如果有很多数据点)

因此,您希望最小化差异(k)

所以你想知道导数ie d/dk Diff(k)=0

牛顿·拉斐逊在这个新函数D’(k)上

在k=1时启动它,它应该可以很快找到解决方案

这可能会给你一个最佳的计算时间

如果你想要更简单的东西,就从0两边的k1和k2开始

所以说Diff(1.5)=-3和Diff(2.9)=7

那么你可以选择一个k,比如说,在1.5到2.9之间的3/10(10=7--3)


根据产生的是正值还是负值,将其用作新的k1或k2,冲洗并重复

我建议在Newton Raphson上尝试某种变体

构造一个函数Diff(k),用于查看固定标记a和B之间两个图形的面积差异

从数学上来说,我猜它是积分(x=A到B){f(x)-k*g(x)}dx

不管怎样,实际上你可以减去这些值

比如,如果你的范围从X=-10到10,在[-10,10]中的每个整数i上都有一个f(i)和g(i)的数据点(即21个数据点)

然后求和(i=-10到10){f(i)-k*g(i)}

基本上,你会期望这个函数看起来像一条抛物线——会有一个最佳的k,在任何一个方向稍微偏离它都会增加总的面积差

差别越大,你就会期望差距越大

因此,这应该是一个非常平滑的函数(如果有很多数据点)

因此,您希望最小化差异(k)

所以你想知道导数ie d/dk Diff(k)=0

牛顿·拉斐逊在这个新函数D’(k)上

在k=1时启动它,它应该可以很快找到解决方案

这可能会给你一个最佳的计算时间

如果你想要更简单的东西,就从0两边的k1和k2开始

所以说Diff(1.5)=-3和Diff(2.9)=7

那么你可以选择一个k,比如说,在1.5到2.9之间的3/10(10=7--3)


根据产生的是正值还是负值,将其用作新的k1或k2,冲洗并重复

,以防将来有人偶然发现,下面是一些代码(c++) 诀窍是首先按比例因子对样本进行排序,这将使每个样本最适合2个样本。然后从两端开始迭代到导致最小绝对偏差(L1范数)的因子

除排序之外的所有内容都有一个线性运行时=>运行时为O(n*logn)

/*
*求x,使std::abs(pA[i]-pB[i]*x)上从i=0到(n-1)的和最小
*然后返回x
*/
浮点线性插值(常数浮点*pA,常数浮点*pB,整数n)
{
/*
*一般情况下,代数解是不可能的
*=>迭代算法
*/
if(n<0)
抛出“linearFit具有无效参数:应为n>=0”;
如果(n==0)
返回0;//如果没有要拟合的项,则任何因子都是完美拟合(总和始终为0)
如果(n==1)
返回pA[0]/pB[0];//返回x,使pA[0]=pB[0]*x
//如果您不喜欢这样,请使用std::vector:P
std::unique_ptr targetValues_u(新浮点[n]);
std::唯一的ptr索引(新的int[n]);
//获取正确的指针:
float*targetValues=targetValues_uz.get();//值