Matlab的程序可以运行,将其转换成C++之后,当tf1>50摄氏度时,程序陷入循环,变量不发生变化,导致结果不收敛,无法跳出循环
问题相关代码,请勿粘贴截图
QtData1 Refrigerant_heat_exchang_loss_Body::Caculate_heat_loss()
{
PI = 3.1416;
tf1=75;
tf2=15;//%tf1制冷剂的温度,tf2为空气温度,单位:℃;
d1=0.0064;//紫8铜管道内径d1,
l=1.0; //长l,单位:m;
d2=0.008; //d2为紫铜管道外径,
d3 = 0.026; //d3为保温层外径, 单位m;
u = 0.51;// 环境风速,单位m/s;
g = 9.8; //重力加速度;
k2 = 398.0;
k3 = 0.024;// k2为紫铜管道导热系数,k3为保温层导热系数, 单位(w / (m.k);
A1 = (PI * d1*l); //A1为紫铜管道内壁面积, 单位(m ^ 2);
A2 = (PI * d2*l); //A2为紫铜管道外表面面积, 单位(m ^ 2);
tmax = tf1;
tmin = tf2;//调用成员函数时对数据成员进行初始化
vector<double> t0 = { -5, 0 ,5 ,10 ,15 ,20 ,25 ,30 ,35, 40 ,45};//干空气的的热物理性质;
vector<double> k0 = { 0.024,0.0244, 0.0248,0.0251, 0.0255, 0.0259, 0.0263 ,0.0267 ,0.0272 ,0.0276 ,0.0280};
vector<double> v0 = { 12.86e-6,13.28e-6 ,13.72e-6 ,14.16e-6 ,14.61e-6, 15.06e-6 ,15.53e-6 ,16.00e-6 ,16.48e-6 ,16.96e-6, 17.46e-6};
vector<double> Pr0 = { 0.710, 0.707 ,0.706 ,0.705 ,0.704 ,0.703 ,0.702 ,0.701, 0.700 ,0.699, 0.6985};
vector<double> t1 = { 0, 5 ,10,15 ,20 ,25 ,30, 35 ,40 ,45 ,50, 55, 60, 65, 70, 75, 80,85 ,90, 95, 100,105,110,115,120}; //R134a制冷剂的热物理性质;
vector<double> k1 = { 0.0934, 0.0911, 0.0888, 0.0865, 0.0842, 0.0819, 0.0796, 0.0773, 0.0750, 0.0727, 0.0704, 0.0682, 0.0659,0.0635, 0.0602, 0.0583, 0.0554, 0.00524, 0.0493, 0.0464, 0.0434,0.0404 ,0.0374, 0.0344, 0.0314 };
vector<double> av1 = { 2.633e-3,2.769e-3,2.905e-3,2.905e-3, 3.252e-3, 3.475e-3, 3.698e-3 ,3.992e-3, 4.286e-3 ,4.6895e-3, 5.093e-3, 5.432e-3, 5.932e-3, 6.325e-3, 6.735e-3, 7.125e-3, 7.576e-3, 7.912e-3, 8.315e-3, 8.734e-3, 9.125e-3, 9.536e-3, 9.932e-3 ,10.321e-3,10.712e-3 };
vector<double> v1 = { 2.22e-7,2.129e-7, 2.018e-7 ,1.9305e-7, 1.843e-7, 1.767e-7, 1.691e-7, 1.6225e-7, 1.554e-7, 1.4925e-7 ,1.431e-7, 1.381e-7, 1.321e-7, 1.263e-7, 1.205e-7, 1.142e-7, 1.082e-7, 1.02e-7, 0.96e-7, 0.9e-7, 0.84e-7,0.78e-7,0.72e-7, 0.66e-7,0.6e-7 };
vector<double> Pr1 = { 4.108,4.0115,3.915, 3.84, 3.765,3.7065, 3.648, 3.606, 3.564, 3.5395,3.515, 3.482, 3.452, 3.412, 3.354,3.313, 3.271, 3.23, 3.19, 3.15, 3.11,3.07,3.03, 2.99 ,2.95 };
i = 1;
while (i > 0)
{
/*if (abs(tmax - tmin) <=0.001) {
i = 0;
continue;
}*/
tw1 = (tmax + tmin) / 2;
cout << "tw1——————————————————————————————————————————" << tw1 << endl;
cout << "tmax——————————————————————————————————————————" << tmax << endl;
cout << "tmin——————————————————————————————————————————" << tmin << endl;
/*a++;*/
//cout << "tw1——————————————————————————————————————————" << tw1 << endl;
tx1 = abs(tf1 - tw1); //tw1为紫铜管道内壁面温度;
tm1 = (tf1 + tw1) / 2; //制冷剂的定性温度;
vector<double>tm1v = vector<double>{tm1};
av1s = Interp1(t1, av1, tm1v)[0];
k1s = Interp1(t1, k1, tm1v)[0];
v1s = Interp1(t1, v1, tm1v)[0];
Pr1s = Interp1(t1, Pr1, tm1v)[0];
Gr = av1s * g*pow(l,3)*tx1 / (pow(v1s,2));//格拉晓夫数;(pow(v1s, 2))
C1 = 0.023;
Re1 = (u*d1) / v1s;
Nu1 = C1 * pow(Re1, 0.8)*pow(Pr1s, 0.3);
h1 = (k1s / d1)*Nu1;//管内强制对流换热系数
Q1 = h1 * A1*(tf1 - tw1); //Q1为制冷剂与内壁面换热量;
Q2 = Q1;
tw2 = tw1 - Q2 * ((1 / (2 * PI*k2*l))*log(d2 / d1) + (1/(2 * PI*k3*l))*log(d3 / d2)); //tw2为紫铜管道外壁面温度;
//cout << "tw2——————————————————————————————————————————" << tw2 << endl;
if (tw2 < tf2)//外壁温小于空气温度
{
tmin = tw1;
// tw1 = (tmax + tw1) / 2;
continue;
}
else
{
tm2 = (tf2 + tw2) / 2; //紫铜管道外对流定性温度;
vector<double> tm2v = vector<double>{tm2};
k2k = Interp1(t0, k0, tm2v)[0];
v2k = Interp1(t0, v0, tm2v)[0];
Pr2k = Interp1(t0, Pr0, tm2v)[0];
if (Gr2 <3e9)
{
//C2 = 0.48; n2 = 1 / 4;
C2 = 0.59; n2 = 1 / 4;
}
else
{
//if ((5.76e8 < Gr2) && (Gr2 <= 4.65e9))
if (Gr2 >2e10)
{
//C2 = 0.0165; n2 = 0.42;
C2 = 0.11; n2 = 1 / 3;
}
else
{
//C2 = 0.11; n2 = 1 / 3;
C2 = 0.0292; n2 = 0.39;
}
}
Nu2 = C2 * (pow(Gr2*Pr2k, n2));
hh = Gr2 / (pow(Re2, 2)); //《传热学》混合对流P273
if (hh >=10) //强制对流
{
Nu3 = Nu2;
}
else //自然对流和强制对流
{
if (hh <= 0.1)
{
Nu3 = Nu4;
}
else
{
Nu3 = pow((pow(Nu4, 3) + pow(Nu2, 3)),1/3);
}
}
h2 = (k2k /d2)*Nu3;// h2为空气与铜管外表面对流换热系数;
Q3 = h2 * A2*(tw2 - tf2);
jd = abs(Q1 - Q3) / Q1;
if (jd <=0.1)
{
i=0;
}
else
{
/*temps.push_back(tw1);*/
if (Q1 > Q3)
{
tmin = tw1;
continue;
}
else
{
tmax = tw1;
continue;
}
}
}
}
return Qt;
}
int Refrigerant_heat_exchang_loss_Body::findNearestNeighbourIndex(double value, vector<double>& x)
{
double dist = FLT_MAX;
int idx = -1;
for (int i = 0; i < x.size(); ++i) {
double newDist = value - x[i];
if (newDist > 0 && newDist < dist) {
dist = newDist;
idx = i;
}
}
return idx;
}
vector<double> Refrigerant_heat_exchang_loss_Body::Interp1(vector<double> &x, vector<double> &y, vector<double> &x_new)
{
vector< double> y_new;
y_new.reserve(x_new.size());
std::vector< double > dx, dy, slope, intercept;
dx.reserve(x.size());
dy.reserve(x.size());
slope.reserve(x.size());
intercept.reserve(x.size());
for (int i = 0; i < x.size(); ++i) {
if (i < x.size() - 1)
{
dx.push_back(x[i + 1] - x[i]);
dy.push_back(y[i + 1] - y[i]);
slope.push_back(dy[i] / dx[i]);
intercept.push_back(y[i] - x[i] * slope[i]);
}
else
{
dx.push_back(dx[i - 1]);
dy.push_back(dy[i - 1]);
slope.push_back(slope[i - 1]);
intercept.push_back(intercept[i - 1]);
}
}
for (int i = 0; i < x_new.size(); ++i)
{
int idx = findNearestNeighbourIndex(x_new[i], x);
y_new.push_back(slope[idx] * x_new[i] + intercept[idx]);
}
return y_new;
}
运行结果及报错内容
我的解答思路和尝试过的方法
通过添加语句使循环跳出,但是不能实现
我想要达到的结果
当tf1>50摄氏度的时候,可以计算出结果,而不是一直陷入循环,Matlab可以实现,但不知道C++为何陷入循环