MatLab GUI 问题:计算积分

MatLab GUI Troubles: Calculating an Integral

我创建了一个 matlab GUI,用户可以在其中选择要积分的变量、输入方程以及下限和上限。当我的代码去计算按钮回调的积分时,我得到一个我不明白的错误。

这是导致错误的代码行:

i1 = int( eval(get(handles.edit1,'string')),
          (handles.respectvar), 
          get(handles.edit3),
          get(handles.edit2)
        );

%respactvar is the user-selected variable, and edit3 and edit2 are the lower and upper limits.

这是错误信息:

Error using sym>tomupad (line 1135) Conversion to 'sym' from 'struct' is not possible.

Error in sym (line 151) S.s = tomupad(x);

Error in sym/int (line 142) b = sym(b);

Error in projectCALC>pushbutton1_Callback (line 376) i1=int(eval(get(handles.edit1,'string')),(handles.respectvar),get(handles.edit3),get(handles.edit2));

Error in gui_mainfcn (line 95) feval(varargin{:});

Error in projectCALC (line 42) gui_mainfcn(gui_State, varargin{:});

Error in @(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))

Error while evaluating UIControl Callback

谢谢!

您的代码存在多个问题。

第一个问题,如,是你忘了get最后两个编辑框的string属性,而你这样做是为了第一个.

第二个问题是 eval 效率很低,而且在你的情况下,非常不安全。如果有人在编辑框中写了一个 system() 调用,擦除您的硬盘驱动器怎么办?

第三个问题是即使使用evalstr2funcint也需要它的第一个参数是一个符号表达式。这是一件好事:您实际上不必使用 eval,您只需将第一个字符串转换为 sym.

第四个问题是 handles.respectvar 似乎也是一个 GUI 对象,因此您可能需要 get() 一些 属性 才能将其用作积分变量。

假设我的怀疑是正确的,你的edit1包含了一个像'3*x+y'这样的字符串,edit2edit3是限制,比如'1''3',并且 handles.respectvar 有一个 属性 计算结果为 'x',那么你应该调用

formula = sym(get(handles.edit1,'string'));
variable = handles.respectvar;    %// more likely: get(handles.respectvar,...)
lim1 = str2double(get(handles.edit3,'string'));
lim2 = str2double(get(handles.edit2,'string'));
i1 = int(formula,variable,lim1,lim2);

一些注意事项:

  • 不要害怕在有助于提高可读性的地方使用临时变量。
  • 我将 formulasym 转换为 string,否则你会收到警告或错误(取决于 MATLAB 版本)
  • 我留下了lim1 <-> edit3, lim2 <-> edit2的顺序。确保这确实是您想要的,并且订单没有被撤销。
  • 我将积分限制转换为 double,但似乎 sym/int 也将接受字符串输入作为限制变量,所以这主要是为了清楚起见。