如何从列表中执行值的线性插值(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)来运行我的程序的其余部分。
我该怎么做呢?我考虑过使用字典方法,但我不想使用键字符串,因为所有的值都很容易被排序为数字。
如果您能提供相关信息,我将不胜感激。
你错了
创建一个属性类
按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"];