double mesh_heart::get_z(double x,double y,double ans_start,double balance_check)//根据给定的x,y以及迭代初值求z值 { double a; double b; a = x*x + (9.0/4.0)*y*y -1; b = x*x + (9.0/80.0)*y*y; for(int i = 0; i < 200; ++i)//牛顿迭代 { ans_start = ans_start - balance_check*find_f(a,b,ans_start) / find_f1(a,b,ans_start); } double check = find_f(a,b,ans_start); if(check > 0.000000001 || check < -0.000000001) { return -999.0;//未找到逼近解,返回失败 } else { return ans_start;//返回找到的解 } }
void ClayOMBiomod::set_rates (const Soil& soil, const std::vector<SMB*>& smb) const { // We always have two SMB pools in BIOMOD. daisy_assert (smb.size () == 2); // Total death and maintenance. const double t_SMB1 = smb[0]->turnover_rate + smb[0]->maintenance; const double t_SMB2 = smb[1]->turnover_rate + smb[1]->maintenance; // The ratios we want to change. const double r_SMB1 = smb[0]->turnover_rate / t_SMB1; const double r_SMB2 = smb[1]->turnover_rate / t_SMB2; for (unsigned int i = 0; i < soil.size (); i++) { // Find modifier. const double f = find_f (r_SMB1, r_SMB2, soil.clay (i)); daisy_assert (f > 0.0); // Update turnover rate and maintence. const double clay_rate1 = smb[0]->turnover_rate * f; daisy_assert (clay_rate1 < 1.0); smb[0]->clay_turnover.push_back (clay_rate1); daisy_assert (t_SMB1 >= clay_rate1); smb[0]->clay_maintenance.push_back (t_SMB1 - clay_rate1); const double clay_rate2 = smb[1]->turnover_rate * f; daisy_assert (clay_rate2 < 1.0); smb[1]->clay_turnover.push_back (clay_rate2); daisy_assert (t_SMB2 >= clay_rate2); smb[1]->clay_maintenance.push_back (t_SMB2 - clay_rate2); } for (unsigned int i = 0; i < smb.size (); i++) { daisy_assert (smb[i]->clay_turnover.size () == soil.size ()); daisy_assert (smb[i]->clay_maintenance.size () == soil.size ()); } }
err.error ("\ You must have exactly two SMB pool with the 'biomod' clay model"); return false; } // Total death and maintenance. const double t_SMB1 = smb[0]->turnover_rate + smb[0]->maintenance; const double t_SMB2 = smb[1]->turnover_rate + smb[1]->maintenance; // The ratios we want to change. const double r_SMB1 = smb[0]->turnover_rate / t_SMB1; const double r_SMB2 = smb[1]->turnover_rate / t_SMB2; #ifdef OLD_VERSION // The ratio modifier at 0.1 clay. const double f = find_f (r_SMB1, r_SMB2, 0.1); if (!approximate (f, 1.0, 0.01)) { std::ostringstream tmp; tmp << "\ The biomod clay model is calibrated so f (0.1) must be 1.0, that is,\n\ the turnover and maintenance parameters are normalized for 10% clay content.\n\ However, f (0.1) is " << f << ", which mean any results produced are bogus"; err.warning (tmp.str ()); } #else // !OLD_VERSION // The ratio modifier at 0.0 clay. const double f = find_f (r_SMB1, r_SMB2, 0.0); if (!approximate (f, 1.0, 0.01)) { std::ostringstream tmp;