【问题标题】:How to perform linear interpolation of value from a list (C#)如何从列表中执行值的线性插值(C#)
【发布时间】:2016-11-03 00:36:35
【问题描述】:

我很抱歉这可能是编程 101,但我的经验有限,因为编程对我来说不是日常活动。如果之前已经回答过一百万次,我也很抱歉,但我在搜索中没有成功找到它,因为我不确定这会被认为是什么(字典?对象?列表?)

我想创建一个有序 doubles 列表,这些列表对应于我感兴趣的特定属性,如下所示:

[(a1,a2,a3,...),(b1,b2,b3,...),(c1,c2,c3,...),...]

我的程序将计算一个输入 (a_input),它很可能位于值列表之间,例如:

a3

然后,我希望程序能够识别它在 a3 和 a4 之间,并使用此信息对其他值进行线性插值,例如:

(a_input - a3)/(a4 - a3) = (c_input - c3)/(c4-c3)

这将输出我感兴趣的值(例如 c_input)来运行我的程序的其余部分。

我将如何做到这一点?我考虑过一种字典方法,但我不想要键字符串,因为所有值都可以很容易地被排序为数字。

我们将不胜感激任何输入或查找信息的方向。

【问题讨论】:

  • 我只需在列表中订购 a0-an,然后对输入使用 BinarySearch()。如果它返回n,其中n是正数,那么输入就是an,如果它是负数,则输入在a[~n]和a[~n]+1之间
  • 感谢您对 Martheen 的反馈。不幸的是,我不相信它会这么简单。 a1,a2,a3,... 都对应于同一对象的属性,而 b1,b2,b3,.. 等对应于不同对象的属性,所以我不确定如何对列表进行排序。
  • 如果这是时间序列数据,字典正是您所需要的。
  • 展示一个更具体的例子。我们仍在试图弄清楚 a1、a2、b3 等是什么。

标签: c# object dictionary interpolation


【解决方案1】:

你错了

创建一个属性类
按 temp 顺序添加它们,或者您可以在 foreach 上排序

class PhysicalProperties 
{
    public double Temp { get; set; }
    public double Vis  { get; set; }
    public double Dens { get; set; }
}

List<PhysicalProperties> ListPhysicalProperties = new List<PhysicalProperties>(); 
// add the PhysicalProperties in temp order

PhysicalProperties fpUnder;
PhysicalProperties fpOver;
foreach(PhysicalProperties fp in ListPhysicalProperties) 
{
   if(f.Temp >= temp) 
   {
       fpOver = fp;
       break:
   }
   fpUnder = fp;
}

// do the liner interpolation on fpUnder and fpOver  
// check for possible null

还有 LINQ,但既然你必须先得到我认为循环是要走的路
我怀疑你会有超过 1000 个临时工

附言我拥有化学工程学士学位
浮动可能对你来说足够大了

【讨论】:

  • 嗨狗仔队,感谢您对简化代码的建议。我以前没有使用过类,而且我不完全确定您编写的所有内容,但我认为我有一般概念(通过物理属性“temp”和条件 f.Temp >= temp 循环遍历类)。我不确定“fpUnder”和“fpOver”指的是什么,也不知道如何获取;放;访问器工作也不在哪里输入表中的值。我将研究使用类,看看我是否能够理解您的建议并可能将它们实现到我的代码中。
【解决方案2】:

我确信有更有效/更简单的方法可以实现这一点,但以下 sn-p 是我能够查找和插入 rho 值的方式。我收到的输出是 Rho=1.1855,这是预期的。我将能够使用它来插入使用此方法的其他值。谢谢大家看我的问题,如果有人有任何简化代码的建议,请告诉我。

//Dictionaries for the different air properties
                //Air properties for T=0
        Dictionary<string, double> a = new Dictionary<string, double>();
        {
            a.Add("T",0);
            a.Add("Rho", 1.293);
            a.Add("Cp", 1.005);
            a.Add("k", 0.0243);
            a.Add("Nu", 13.30*Math.Pow(10,-6));
            a.Add("Betta", 3.67 * Math.Pow(10, -3));
            a.Add("Pr", 0.715);
        }
            //Air properties for T=20
        Dictionary<string, double> b = new Dictionary<string, double>();
        {
            b.Add("T", 20);
            b.Add("Rho", 1.205);
            b.Add("Cp", 1.005);
            b.Add("k", 0.0257);
            b.Add("Nu", 15.11 * Math.Pow(10, -6));
            b.Add("Betta", 3.43 * Math.Pow(10, -3));
            b.Add("Pr", 0.713);
        }
         //Air properties for T=40
        Dictionary<string, double> c = new Dictionary<string, double>();
        {
            c.Add("T", 40);
            c.Add("Rho", 1.127);
            c.Add("Cp", 1.005);
            c.Add("k", 0.0271);
            c.Add("Nu", 16.97 * Math.Pow(10, -6));
            c.Add("Betta", 3.20 * Math.Pow(10, -3));
            c.Add("Pr", 0.711);
        }

        //temporary values for example
        double T = 25;
        double Rho=0;

        // Code for property lookup
        if (T <= a["T"])
        {
            Rho = a["Rho"];
        }
        else if (T == b["T"])
        {
            Rho = b["Rho"];
        }
        else if (T < c["T"])
        {
            Rho = (T - b["T"]) * (c["Rho"] - b["Rho"]) / (c["T"] - b["T"]) + b["Rho"];
        }
        else
            Rho = c["Rho"];

【讨论】:

  • 哇,它适用于三个完整的临时工。你打算用 4 或 40 做什么?然后冲洗并重复每个属性。
  • 我不明白你为什么如此居高临下。我明确表示您的选择更有效,但由于我还是编码新手,所以我不确定如何以这种能力进行编码。
  • 它结合了您的问题和答案。你有两个反对票和两个投票结束,并且没有做任何事情来清理你的问题。你的问题是如何做一个字典,这是错误的方法。我只是从模糊的评论中弄清楚你想要什么,只是因为那是(曾经)我的领域。标题是如何进行线性插值,你知道怎么做。
猜你喜欢
  • 2012-02-08
  • 2020-04-22
  • 2012-01-29
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多