46 void epsp(
double * x,
double *root,
int * stepsp,
double * v,
47 int n,
double z,
double lambda0)
51 int rho_1, rho_2, rho, rho_T, rho_S;
52 int V_i_b, V_i_e, V_i;
53 double lambda_1, lambda_2, lambda_T, lambda_S, lambda;
54 double s_1, s_2, s, s_T, s_S, v_max, temp;
55 double f_lambda_1, f_lambda_2, f_lambda, f_lambda_T, f_lambda_S;
61 printf(
"\n z should be nonnegative!");
76 lambda_1=v_max - z; lambda_2=v_max;
91 f_lambda_1=s_1-rho_1* lambda_1 -z;
93 rho_2=0; s_2=0; f_lambda_2=-z;
97 if ( (lambda<lambda_2) && (lambda> lambda_1) ){
103 i=V_i_b; j=V_i_e; rho=0; s=0;
105 while( (i <= V_i_e) && (x[i] <= lambda) ){
108 while( (j>=V_i_b) && (x[j] > lambda) ){
115 temp=x[i]; x[i]=x[j]; x[j]=temp;
120 rho=V_i_e-j; rho+=rho_2; s+=s_2;
121 f_lambda=s-rho*lambda-z;
123 if ( fabs(f_lambda)< delta ){
128 lambda_2=lambda; s_2=s; rho_2=rho; f_lambda_2=f_lambda;
130 V_i_e=j; V_i=V_i_e-V_i_b+1;
133 lambda_1=lambda; rho_1=rho; s_1=s; f_lambda_1=f_lambda;
135 V_i_b=i; V_i=V_i_e-V_i_b+1;
157 lambda_T=lambda_1 + f_lambda_1 /rho_1;
159 if (lambda_2 + f_lambda_2 /rho_2 > lambda_T)
160 lambda_T=lambda_2 + f_lambda_2 /rho_2;
164 lambda_S=lambda_2 - f_lambda_2 *(lambda_2-lambda_1)/(f_lambda_2-f_lambda_1);
166 if (fabs(lambda_T-lambda_S) <= delta){
167 lambda=lambda_T; flag=1;
172 lambda=(lambda_T+lambda_S)/2;
178 while( (i <= V_i_e) && (x[i] <= lambda) ){
184 while( (j>=V_i_b) && (x[j] > lambda) ){
185 if (x[j] > lambda_S){
194 if (x[i] > lambda_S){
205 temp=x[i]; x[i]=x[j]; x[j]=temp;
210 s_S+=s_2; rho_S+=rho_2;
213 f_lambda_S=s_S-rho_S*lambda_S-z;
214 f_lambda=s-rho*lambda-z;
215 f_lambda_T=s_T-rho_T*lambda_T-z;
219 if ( fabs(f_lambda)< delta ){
224 if ( fabs(f_lambda_S)< delta ){
226 lambda=lambda_S; flag=1;
229 if ( fabs(f_lambda_T)< delta ){
231 lambda=lambda_T; flag=1;
242 lambda_2=lambda; s_2=s; rho_2=rho;
245 lambda_1=lambda_T; s_1=s_T; rho_1=rho_T;
246 f_lambda_1=f_lambda_T;
250 while( (i <= V_i_e) && (x[i] <= lambda_T) ){
253 while( (j>=V_i_b) && (x[j] > lambda_T) ){
261 V_i_b=i; V_i=V_i_e-V_i_b+1;
264 lambda_1=lambda; s_1=s; rho_1=rho;
267 lambda_2=lambda_S; s_2=s_S; rho_2=rho_S;
268 f_lambda_2=f_lambda_S;
272 while( (i <= V_i_e) && (x[i] <= lambda_S) ){
275 while( (j>=V_i_b) && (x[j] > lambda_S) ){
283 V_i_e=j; V_i=V_i_e-V_i_b+1;
287 lambda=(s - z)/ rho; flag=1;
305 #endif //USE_GPL_SHOGUN