如何从列表中执行值的线性插值(C#)

时间:2016-06-30 18:54:59

标签: c# object dictionary interpolation

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

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

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

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

a3< a_input< A4

然后我会喜欢程序识别它位于a3和a4之间并使用此信息对其他值进行线性插值,例如:

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

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

我究竟会如何实现这一目标?我考虑过字典方法,但我不想要键字符串,因为所有值都可以很容易地被排序。

非常感谢任何查找信息的输入或指示。

2 个答案:

答案 0 :(得分:0)

你错了

创建一个属性类 按照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个临时工

P.S。我有化学工程学士学位 漂浮可能足够大

答案 1 :(得分:-1)

我确信有更多有效/简单的方法可以实现这一点,但下面的代码片段是我如何查找和插入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"];