// // ambiguity候補を残差の大小で減らす // #include #include extern int flag_unresolve; extern double GPSTIME; int remove_candidate(int pass_check,double pass_res[128],int pass_amb[128],int Pass[1332]) { int flag_iter; int count=0,i,j,k=0; int candidate; int satn; double threshold = 5; double min_res=10,max_res=1.0; //ここで残っている候補数を代入する satn=pass_check-1; if(pass_res[pass_amb[0]]<1.0) count++; if(pass_res[pass_amb[1]]<1.0) count++; if(pass_res[pass_amb[2]]<1.0 && pass_check>=3) count++; if(pass_res[pass_amb[3]]<1.0 && pass_check>=4) count++; if(pass_res[pass_amb[4]]<1.0 && pass_check>=5) count++; if(pass_res[pass_amb[5]]<1.0 && pass_check>=5) count++; if(pass_res[pass_amb[6]]<1.0 && pass_check>=6) count++; if(pass_res[pass_amb[7]]<1.0 && pass_check>=7) count++; if(pass_res[pass_amb[8]]<1.0 && pass_check>=8) count++; if(pass_res[pass_amb[9]]<1.0 && pass_check>=9) count++; if(pass_res[pass_amb[10]]<1.0 && pass_check>=10) count++; //残差が2つ以上の候補で1未満のときはthresholdを上げる if(count>=2) threshold = 7.5; //アンビギュイティ候補がsatn個残った時の処理 if(pass_check-1==satn){ for(j=0;j<=satn;j++){ for(i=0;i<=satn;i++){ if(i!=j){ //残差の最小値を求める if(pass_res[pass_amb[j]]pass_res[pass_amb[i]] && pass_res[pass_amb[j]]>max_res) max_res=pass_res[pass_amb[j]]; } } } //残差の最小値に対してチェックする for(i=0;i<=satn;i++){ if(pass_res[pass_amb[i]]>=threshold*min_res){ Pass[pass_amb[i]]=Pass[pass_amb[i]]-1; k++; } } //候補が1つになると、それを真としている if(k==satn){ pass_check=1; pass_amb[1]=candidate; flag_iter = pass_amb[1]; flag_unresolve=1; } } if(flag_unresolve!=1) flag_iter=0; return(flag_iter); }