⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 errcheck.m

📁 linear and nonlinear programming solver
💻 M
字号:
function err=errcheck(str, flag)global v lv rv  vn_vars  err = 0;check_obj    = 1;check_cons   = 2;check_bounds = 3;if (isempty(str)) err = 1; return; endtmpstr = str(find(str ~= ' ' & str ~= 0));operator = find(tmpstr == '=' | tmpstr == '>' | tmpstr == '<' );if (~isempty(operator))if (operator(1) == 1 | operator(length(operator)) == length(tmpstr))  err = errmessage('Input incomplete'); return;endendoperator = find(tmpstr == '+' | tmpstr == '-' );if (~isempty(operator))if ( operator(length(operator)) == length(tmpstr))  err = errmessage('Input incomplete'); return;endend% coefficient check ......lbrace = find(str == '{');rbrace = find(str == '}');len = length(lbrace);if ( len ~= length(rbrace) )   errmessage('Braces unmatched'); return;endif (len ~= 0)  tmpstr =['+' tmpstr 'z'];  tmplbrace = find(tmpstr == '{');  tmprbrace = find(tmpstr == '}') ;  patt = [];  for i = 1:len    if (~isletter(tmpstr(tmprbrace(i)+1)) &...         isempty(findstr(tmpstr(tmprbrace(i)+1),'+-<>='))) |...         isempty(findstr(tmpstr(tmplbrace(i)-1),'+-<>='))      errstr = 'A coefficient must be a number or an expression in "{}"';      err = errmessage(errstr);      return;    end    if (rbrace(i)-lbrace(i) <2)       errmessage('Empty {}'); return;    end    inner = lbrace(i):rbrace(i);    patt = [patt inner];    lbracket = find(str(inner) == '(');    rbracket = find(str(inner) == ')');    if (length(lbracket) ~= length(rbracket))       err = errmessage(' "(" dose not match ")" ');  return;     end  end  str(patt) = [];end% general checking ......error = ~( ...          str == '+' | str == '-' | str == '.' | str == ' ' ...        | str ==  0  | str == '=' | str == '<' | str == '>' ...        | (str >= '0' & str <= '9') | isletter(str));if any(error)    errstr = str(find(error));   err = errmessage(['Illegal charactor(s): ' errstr]); return; endoperator = (find(str == '+' | str == '-' ));len = length(operator);if (len > 1)   error = any(operator(2:len) - operator(1:len-1) == 1);  if any(error)    err = errmessage('Successive operators not allowed'); return;   endend% objective check ......if (flag == check_obj)  error = (str == '=' | str == '>' | str == '<');   if any(error)     err = errmessage('"=", "<" or ">" not allowed in objective');     return;   end  nonblank = find(str ~= ' ');  s3 = lower(str(nonblank(1):nonblank(1)+2));  if any(s3 ~= 'max') & any(s3 ~= 'min')      err = errmessage('Max or min must appear first in objective');     return;  else     str=str(nonblank(1)+3:length(str));  endend     % constraints checking ......if (flag == check_cons)  operator = find(str == '=' | str == '>' | str == '<');  if (length(operator) ~= 1)    err = errmessage('Use one and only one of "=", "<" or ">"');     return;  endend% bounds checking ......if (flag == check_bounds)  if (~isempty(find(str == '=')))    err = errmessage('NO "=" allowed in bounds'); return;  end  operator = find(str == '>' | str == '<' );  len_op = length(find(str == '>' | str == '<' ));  if (len_op < 1 | len_op > 2)    err = errmessage('There must be 1 or 2 inequalities in a bound');     return;  elseif (len_op == 2)    gt = length(find(str == '>'));    lt = length(find(str == '<'));    if (~(gt == 2 | lt == 2))      err = errmessage('Misused ">" or "<"');      return;    end  end    interval = [0 operator length(str)+1];  for i = 1:length(interval)-1    substr = str(interval(i)+1:interval(i+1)-1);    if (isempty(substr)) substr = '9'; end    substr = substr(find(substr ~= ' '));    subletter = find((substr >= 'A' & substr <= 'Z') | ...                (substr >= 'a' & substr <= 'z') );    if(~isempty(substr))      subop = find(substr =='+' | substr =='-' | substr =='*');    else      subop = [];    end    if (~isempty(subletter))      if (subletter(1) ~= 1)        err = errmessage('Coefficients on variables not allowed');         return;      end      if (~isempty(subop))        err = errmessage('Arithmatic operators on variables not allowed');         return;      end    end  end  letter = find((str >= 'A' & str <= 'Z') | (str >= 'a' & str <= 'z'));  len_letter = length(letter);  if (len_letter == 0) err = errmessage('No variable'); return; end  error = (letter(1) < operator(1) & letter(len_letter) > operator(1)) ...        | (letter(1) < operator(len_op) & ...          letter(len_letter) > operator(len_op)) ...        | (len_op == 2 & letter(1) < operator(1)) ...        | (len_op == 2 & letter(len_letter) > operator(len_op));   if any(error)     err = errmessage('Illegal expression in bounds');     return;   endend% blank space check ......nonblank = str ~= ' ';slen = length(nonblank);nonblank = [nonblank 1]; for i = 1:slen  if (nonblank(i) == 0 & nonblank(i+1) == 1) nonblank(i) = 1 ; endendnonblank = nonblank(1:slen);str = str(find(nonblank == 1));str = ['@' str '@'];blank = find(str == ' ');if (~isempty(blank))  b_blank = str(blank -1);  a_blank = str(blank +1);  error =  ( (b_blank >= '0' & b_blank <= '9') & ...              (a_blank >= '0' & a_blank <= '9') ) ...        | ( isletter(b_blank) & isletter(a_blank) ) ...        | ( isletter(b_blank) & (a_blank >= '0' & a_blank <= '9') );if any(error) err = errmessage('Space in wrong place'); return; end end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -