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

本文关键字:插值 线性 列表 执行 | 更新日期: 2023-09-27 17:53:44

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

我想创建一个有序的双精度列表,对应于我感兴趣的特定属性,如:

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

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

a3 & lt;a_input & lt;a4

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

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

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

我该怎么做呢?我考虑过使用字典方法,但我不想使用键字符串,因为所有的值都很容易被排序为数字。

如果您能提供相关信息,我将不胜感激。

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

你错了

创建一个属性类
按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个温度

注。我有化学工程学士学位
浮动可能足够大

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