【问题标题】:evaluating function only defined by table, C++仅由表定义的评估函数,C++
【发布时间】:2014-09-10 16:49:06
【问题描述】:

我想在 C++ 中评估一个函数,但我的值仅在表中定义,如下所示:

entry #  en(eV)   Effective Qm - Defined in introduction(1E-16*cm^2)

   1        0     4.96
   2    0.001     4.98
   3    0.002     5.02
   4    0.003     5.07
   5    0.005     5.12
   6    0.007     5.15
   7   0.0085     5.18

我想要一个函数,它返回每个能量的有效 Qm。理想的插值值,但现在我会很高兴只四舍五入到 Qm 已知的最接近的能量并给出结果。我不知道应该怎么做。我知道这在 Mathematica 中很容易,但其余代码在 C++ 中要快得多。

【问题讨论】:

  • 您的表格存储在哪里/如何存储?
  • 我只有问题中格式化的文本文件。如果你告诉我应该如何存储它以便于评估,我会这样做
  • 您是在问我们如何解析文本文件、设计类还是什么?
  • 为什么票数接近?插值是一种定义明确的数学运算,但与std::cos() 不同,<cmath> 中没有明显的方法可以做到这一点。 lineair interpolation 上有一个问题,但更具体。

标签: c++ math interpolation


【解决方案1】:

假设您为数据创建了一个结构:

struct energyEntry {
    double energy;
    double Qm;
};

我假设您可以将数据加载到向量中。您寻求帮助的第一级方法只是加载数据并找到最近的条目。您只需跟踪最近的条目并在遍历数据时对其进行更新。最后你会得到最近的物品。

std::vector<energyEntry> entries;
loadEntries(entries); // assuming you can do this

double targetEnergy = 0.0015; // value you want to look up

int best = 0;
for (int x = 1; x < entries.size(); x++)
{
    if (fabs(entries[x].energy-targetEnergy) < fabs(entries[best].energy-targetEnergy))
        best = x;
}

cout << "Qm is " << entries[best].Qm << "\n";

这里有一些警告。确保通过引用将向量传递给loadEntries。如果精度很重要,您可能需要进行浮点比较。您可能希望在函数中使用此代码。但是,这会让你开始。

如果您想做更多事情,可以进行回归以尝试对数据进行建模(线性、逻辑或神经网络)。或者,如果你落在两点之间,你可以插值。但这是一个单独的问题。

【讨论】:

    【解决方案2】:

    Nathan S 贡献了实现手动线性搜索的答案。 C++ 中已经有更好的解决方案。假设相同的设置:

    struct energyEntry {
        double energy;
        double Qm;
    };
    std::vector<energyEntry> entries = loadEntries(); 
    
    double targetEnergy = 0.0015; // value you want to look up
    

    这是在 C++ 中正确完成的方式:

    auto iter = upper_bound(begin(entries), end(entries), targetEnergy, 
      [](energyEntry ee, double target) { return ee.energy < target; });
    if (iter != end(entries)) {
        // *iter is bigger than target
        if (iter != begin(entries)) {
             // iter-1 exists, and it was smaller or equal.
        } else {
           // Target is smaller than smallest value in table
        }
     } else {
        // Value is bigger than largest value in table
     }
    

    这三种情况的具体处理方式取决于您。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 2020-08-24
      • 2016-05-04
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      相关资源
      最近更新 更多