C# 如何:找到一个好的数学算法来随时间分布测量点?

C# 如何:找到一个好的数学算法来随时间分布测量点?,c#,algorithm,math,time,mathematical-optimization,C#,Algorithm,Math,Time,Mathematical Optimization,我目前正在实现一个软件,它可以随时间测量某些值。用户可以选择在28天的持续时间内测量该值100次。(仅举一个例子) 线性分布不是问题,但我目前正试图得到时间跨度内点的对数分布 直接的实现是迭代这些点,因此我需要一个指数函数。(我已经走了这么远!) 我当前的算法(C#)如下所示: long tRelativeLocation = 0; double tValue; double tBase = PhaseTimeSpan.Ticks; int tLastPointMinute = 0; TimeS

我目前正在实现一个软件,它可以随时间测量某些值。用户可以选择在28天的持续时间内测量该值100次。(仅举一个例子)

线性分布不是问题,但我目前正试图得到时间跨度内点的对数分布

直接的实现是迭代这些点,因此我需要一个指数函数。(我已经走了这么远!)

我当前的算法(C#)如下所示:

long tRelativeLocation = 0;
double tValue;
double tBase = PhaseTimeSpan.Ticks;
int tLastPointMinute = 0;
TimeSpan tSpan;
for (int i = 0; i < NumberOfPoints; i++)
{
     tValue = Math.Log(i + 1, NumberOfPoints);

     tValue = Math.Pow(tBase, tValue);
     tRelativeLocation = (long)tValue;
     tSpan = new TimeSpan(tRelativeLocation);
     tCurrentPoint = new DefaultMeasuringPointTemplate(tRelativeLocation);
     tPoints.Add(tCurrentPoint);
}
longtrelativelocation=0;
双重价值;
双tBase=相位时间间隔;
int tlaspointminute=0;
时间跨度tSpan;
对于(int i=0;i
这给了我28天100分的相当“好”的成绩。
前11个点都是0秒,
1秒时第12点,
第20秒,50秒,
第50次,第390分钟,
第95次,28605分钟
第99节37697分钟(距离最后一点还有43小时)

我的问题是: 有没有人知道如何让前20-30分彼此之间的距离更远,或者让最后20-30分靠得更近

我知道我最终将不得不添加一些算法,将第一个点相隔至少一分钟左右,因为我无法将这种行为转化为严格的数学算法

大概是这样的:

if (((int)tSpan.TotalMinutes) <= tLastPointMinute)
{
      tSpan = new TimeSpan((tLastPointMinute +1) * 600000000L);
      tRelativeLocation = tSpan.Ticks;
      tLastPointMinute = (int)tSpan.TotalMinutes;
}

if((int)tSpan.TotalMinutes)您选择的分布曲线取决于您测量的内容

直线、正弦波、多项式或指数曲线可能分别是给定测量集的最佳分布曲线

确定分布曲线后,使用曲线的数学公式,通过计算任意给定时间值(x值)的y值来计算缺少的数据点

例如,对于一条直线,您只需要一个数据点和直线的斜率。假设在时间0时,测量值为10,测量值每分钟增加2。公式为y=2*x+10。如果我们想在x=5(分钟)时计算测量值,公式为20

对于对数曲线,可以使用对数公式。为简单起见,假设实际测量值给出了y=2**x+12的公式;插入要计算的时间值(x值),然后计算测量值(y值)


认识到您是通过计算数据点而不是测量来引入计算错误。您应该以某种方式标记计算出的数据点,以帮助阅读您的图形的人将其与实际测量区分开来。

我不太清楚您试图做什么,您的代码似乎与您的示例不匹配(可能是我把算术搞砸了)。如果你想让你的样本有一个1秒的最小间隔,并且每个点的位置都是最后一个点的x倍(第一个点除外),那么你想找到x,这样x^(n-1)=span。这就是x=exp(log(span)/(n-1))。那么你的点应该是x^I
(i=0;i

从实用的角度来看,对数函数已经在原点附近挤压时间点。幂函数挤压时间点的程度更大。简单乘法如何

 tValue = Math.Log(i + 1, NumberOfPoints);
 tValue = tBase * tValue;
另一种展平曲线的方法是从远离原点的地方开始

for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 10, NumberOfPoints + 9);
for(int i=0;i
tvalue的范围仍然是0到1

在开始时至少有1秒的空间,怎么样

double nextTick = 0;
for (int i = 0; i < NumberOfPoints; i++)
{
  tValue = Math.Log(i + 1, NumberOfPoints);

  tValue = Math.Pow(tBase, tValue);

  if (tValue < nextTick) tValue = nextTick;
  nextTick++;
double nextTick=0;
对于(int i=0;i
Hi Gilbert。谢谢你花时间回答我。我确实有一个可行的算法,并且对数学有一定的理解。我正在搜索的是我当前算法的改进版本,它为对数(时间点)/指数(时间点)提供了一条“更好”的曲线我知道这是一个相当困难的问题,因为人们必须深入研究我的算法。如果有任何悬而未决的问题,请毫不犹豫地提问。我可能没有把我的想法和要求都说清楚。(抱歉!)@yas4891:你的曲线只会和你的数据点一样好。知道使用什么样的曲线更重要。这里有一篇关于曲线拟合的维基百科文章:哦,好的。我不想为许多测量点找到完美的曲线。我宁愿有一个“曲线/公式”这告诉我何时最好地获取每个测量点。应用程序在该时间点获取的数据与我的问题无关。我希望这有助于澄清我的问题problem@yas4891:基本上,您希望占用更多的x(时间)在y变化很快的地方测量,在y变化很慢的地方,你可以进行较少的x测量。快速和缓慢与你正在使用的曲线有关。理想的测量方法是对每个δy进行测量,其中δy是一个常数。我希望这会有所帮助。这不会导致线性曲线吗?我的意思是,这是δy之间的一个常数关系y和x-不是吗?(我真的很想知道我是如何在考试中取得A分数的:-)我清理了代码(删除了不必要的块)。代码给出了我上面写的结果。保罗:谢谢。偏移的想法确实帮了我很多忙。如果再做一些微调,我会让t