00001 #include "fuzzynum.h"
00002 #include <math.h>
00003
00004
00005 fuzzynum::fuzzynum (void)
00006 {
00007
00008 nalph=0;
00009
00010 err=1.0e-8;
00011
00012
00013 alph=NULL;
00014
00015 xmin=NULL;
00016
00017 xmax=NULL;
00018
00019
00020 nval=0;
00021
00022 x = NULL;
00023 }
00024
00025
00026
00027 fuzzynum::~fuzzynum (void)
00028 {
00029 delete [] alph;
00030 delete [] xmin;
00031 delete [] xmax;
00032 delete [] x;
00033 }
00034
00035
00036
00037
00038
00039
00040
00041
00042 void fuzzynum::read (XFILE *in)
00043 {
00044 long i;
00045
00046
00047 xfscanf (in,"%ld",&nalph);
00048
00049 if (nalph<0){
00050 fprintf (stderr,"\n\n number of alpha-cuts is negative in function fuzzynum::read (file %s, line %d)\n",
00051 __FILE__,__LINE__);
00052 }
00053
00054 if (alph==NULL){
00055 alph = new double [nalph];
00056 }
00057 if (xmin==NULL){
00058 xmin = new double [nalph];
00059 }
00060 if (xmax==NULL){
00061 xmax = new double [nalph];
00062 }
00063
00064
00065 for (i=0;i<nalph;i++){
00066 xfscanf(in,"%lf %lf %lf",alph+i,xmin+i,xmax+i);
00067 }
00068
00069 }
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 void fuzzynum::initiate (long n,double *al)
00080 {
00081 long i;
00082
00083
00084 nalph=n;
00085
00086 if (nalph<0){
00087 fprintf (stderr,"\n\n number of alpha-cuts is negative in function fuzzynum::initiate (file %s, line %d)\n",
00088 __FILE__,__LINE__);
00089 }
00090
00091 if (alph==NULL){
00092 alph = new double [nalph];
00093 }
00094 if (xmin==NULL){
00095 xmin = new double [nalph];
00096 }
00097 if (xmax==NULL){
00098 xmax = new double [nalph];
00099 }
00100
00101
00102 for (i=0;i<nalph;i++){
00103 alph[i] = al[i];
00104 xmin[i] = 1.0e40;
00105 xmax[i] = -1.0e40;
00106 }
00107
00108 }
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 double fuzzynum::give_min (double alpha)
00122 {
00123 long i,j;
00124 double min;
00125
00126 j=0;
00127 for (i=0;i<nalph;i++){
00128 if (fabs(alpha-alph[i])<err){
00129 min=xmin[i];
00130 j=1;
00131 break;
00132 }
00133 }
00134
00135 if (j==0){
00136 fprintf (stderr,"\n\n required value of alpha-cut is not found in function give_min");
00137 fprintf (stderr,"\n alpha %lf (file %s, line %d)\n",alpha,__FILE__,__LINE__);
00138 }
00139
00140 return min;
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150 double fuzzynum::give_min (long acutid)
00151 {
00152 if (acutid>nalph){
00153 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00154 fprintf (stderr,"\n in function give_min (file %s, line %d)\n",__FILE__,__LINE__);
00155 }
00156
00157 return xmin[acutid];
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168 double fuzzynum::give_max (double alpha)
00169 {
00170 long i,j;
00171 double max;
00172
00173 j=0;
00174 for (i=0;i<nalph;i++){
00175 if (fabs(alpha-alph[i])<err){
00176 max=xmax[i];
00177 j=1;
00178 break;
00179 }
00180 }
00181
00182 if (j==0){
00183 fprintf (stderr,"\n\n required value of alpha-cut is not found in function give_max");
00184 fprintf (stderr,"\n alpha %lf (file %s, line %d)\n",alpha,__FILE__,__LINE__);
00185 }
00186
00187 return max;
00188 }
00189
00190
00191
00192
00193
00194
00195
00196
00197 double fuzzynum::give_max (long acutid)
00198 {
00199 if (acutid>nalph){
00200 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00201 fprintf (stderr,"\n in function give_max (file %s, line %d)\n",__FILE__,__LINE__);
00202 }
00203
00204 return xmax[acutid];
00205 }
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234 void fuzzynum::save_min (double alpha,double min)
00235 {
00236 long i,j;
00237
00238 j=0;
00239 for (i=0;i<nalph;i++){
00240 if (fabs(alpha-alph[i])<err){
00241 xmin[i]=min;
00242 j=1;
00243 break;
00244 }
00245 }
00246
00247 if (j==0){
00248 fprintf (stderr,"\n\n required value of alpha-cut is not found in function save_min");
00249 fprintf (stderr,"\n (file %s, line %d)\n",__FILE__,__LINE__);
00250 }
00251
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 void fuzzynum::save_min (long acutid,double min)
00263 {
00264 if (acutid>nalph){
00265 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00266 fprintf (stderr,"\n in function save_min (file %s, line %d)\n",__FILE__,__LINE__);
00267 }
00268
00269 xmin[acutid]=min;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281 void fuzzynum::save_alp_min (long acutid,double al,double min)
00282 {
00283 if (acutid>nalph){
00284 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00285 fprintf (stderr,"\n in function save_alp_min (file %s, line %d)\n",__FILE__,__LINE__);
00286 }
00287
00288 alph[acutid]=al;
00289 xmin[acutid]=min;
00290 }
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306 void fuzzynum::save_max (double alpha,double max)
00307 {
00308 long i,j;
00309
00310 j=0;
00311 for (i=0;i<nalph;i++){
00312 if (fabs(alpha-alph[i])<err){
00313 xmax[i]=max;
00314 j=1;
00315 break;
00316 }
00317 }
00318
00319 if (j==0){
00320 fprintf (stderr,"\n\n required value of alpha-cut is not found in function save_max");
00321 fprintf (stderr,"\n (file %s, line %d)\n",__FILE__,__LINE__);
00322 }
00323
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 void fuzzynum::save_max (long acutid,double max)
00335 {
00336 if (acutid>nalph){
00337 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00338 fprintf (stderr,"\n in function save_max (file %s, line %d)\n",__FILE__,__LINE__);
00339 }
00340
00341 xmax[acutid]=max;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353 void fuzzynum::save_alp_max (long acutid,double al,double max)
00354 {
00355 if (acutid>nalph){
00356 fprintf (stderr,"\n\n number of required alpha-cut is greater than number of all alpha-cuts");
00357 fprintf (stderr,"\n in function save_alp_max (file %s, line %d)\n",__FILE__,__LINE__);
00358 }
00359
00360 alph[acutid]=al;
00361 xmax[acutid]=max;
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371 void fuzzynum::print (FILE *out)
00372 {
00373 long i;
00374
00375 fprintf (out,"\n number of alpha-cuts %ld",nalph);
00376 for (i=0;i<nalph;i++){
00377 fprintf (out,"\n alpha %15.12le min %15.12le max %15.12le",alph[i],xmin[i],xmax[i]);
00378 }
00379 }
00380
00381
00382
00383
00384
00385
00386
00387
00388 void fuzzynum::print_minmax (FILE *out)
00389 {
00390 fprintf (out,"\n %15.12le %15.12le",xmin[0],xmax[0]);
00391 }
00392
00393
00394
00395
00396
00397
00398
00399 void fuzzynum::onearray ()
00400 {
00401 long i,j;
00402
00403 nval=nalph*2-1;
00404 if (x==NULL){
00405 x=new double [nval];
00406 }
00407 else{
00408 delete [] x;
00409 x=new double [nval];
00410 }
00411
00412 j=0;
00413 for (i=0;i<nalph;i++){
00414 x[j]=xmin[i];
00415 j++;
00416 }
00417 for (i=nalph-2;i>-1;i--){
00418 x[j]=xmax[i];
00419 j++;
00420 }
00421 }
00422
00423
00424
00425
00426
00427
00428 double fuzzynum::give_val (long i)
00429 {
00430 return x[i];
00431 }
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447 void fuzzynum::save_value (double val)
00448 {
00449 if (xmin[0]>val)
00450 xmin[0]=val;
00451 if (xmax[0]<val)
00452 xmax[0]=val;
00453 }
00454
00455
00456
00457
00458
00459
00460 void fuzzynum::minmax_init ()
00461 {
00462
00463 nalph=1;
00464
00465 if (xmin!=NULL)
00466 delete [] xmin;
00467 xmin = new double [1];
00468 xmin[0] = 1.0e40;
00469
00470 if (xmax!=NULL)
00471 delete [] xmax;
00472 xmax = new double [1];
00473 xmax[0] = -1.0e40;
00474 }
00475