C++程序执行该过程中一直处于不收敛

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;

}

运行结果及报错内容

img

我的解答思路和尝试过的方法
通过添加语句使循环跳出,但是不能实现

我想要达到的结果
当tf1>50摄氏度的时候,可以计算出结果,而不是一直陷入循环,Matlab可以实现,但不知道C++为何陷入循环