在matlab中使用str2func命令构建函数

时间:2015-09-21 08:22:47

标签: matlab

我想用matlab构建一系列不同的函数,并对结果进行整合和区分。但数学上说str2func的输出无法访问变量,或者可能被其他函数使用。 有人帮我解决这个问题吗?

我想创建这些功能:

f1= @(x,l) x.*(l-x);                                      
f2= @(x,l) x.^2.*(l-x).^2.*(l/2-x).^2;                   
f3= @(x,l) x.^3.*(l-x).^3;                                
f4= @(x,l) x.^4.*(l-x).^6.*(l/2-x).^4;                  
f5= @(x,l) x.^5.*(l-x).^5;                              
f6= @(x,l) x.^6.*(l-x).^6.*(l/2-x).^6;                    
f7= @(x,l) x.^7.*(l-x).^7;                                
f8= @(x,l) x.^8.*(l-x).^8.*(l/2-x).^8;                   
f9= @(x,l) x.^9.*(l-x).^9;                              
f10= @(x,l) x.^10.*(l-x).^10.*(l/2-x).^10;

我写这个函数:

syms x l

 f=cell(10,1);

fun=cell(10,1);

for i=1:10

    if mod(i,2) ~= 0

        f{i}=['x','.^',num2str(i),'.*','(l-x)','.^',num2str(i)];

    else

        f{i}=['x','.^',num2str(i),'.*','(l-x)','.^',num2str(i),'.*','(l/2-x)','.^',num2str(i)];

    end

end


for i=1:10

    for j=1:10

        if mod(i,2) ~= 0 & mod(j,2) ~= 0

            Fs = ['(x)','x','.^',num2str(i),'.*','(l-x)','.^',num2str(i),'*','x','.^',num2str(j),'.*','(l-x)','.^',num2str(j)];

            FS = str2func (Fs)
            fjnew = str2func(['(x)','x','.^',num2str(j),'.*','(l-x)','.^',num2str(j)])

            fj_diff = diff(fjnew,x)

当我运行时,错误是:

Undefined function '(x)x.^1.*(l-x).^1' for input arguments of type 'sym'.

Error in sym>funchandle2ref (line 1172)
    S = x(S{:});

Error in sym>tomupad (line 989)
    x = funchandle2ref(x);

Error in sym (line 142)
            S.s = tomupad(x,'');

Error in sym/privResolveArgs (line 810)
                    argout{k} = sym(arg);

Error in sym/diff (line 21)
args = privResolveArgs(S,varargin{:});

您诚挚的 赛义德纳西里

1 个答案:

答案 0 :(得分:2)

我找到了你所有的问题。

  1. 字符“l”不是字符“1”。其中一个是L,另一个是数字。你刚刚在(l-x) 中写了“l”\ \ \而不是“1”\ one \。 编辑我刚才意识到您确实希望l不是1

  2. 函数句柄不是(x)x.^2(随机示例),它们是@(x)x.^2!您忘记在所有通话中添加“@”,因此=['(x)'应为=['@(x)'

  3. 3.您的功能实际上(正如您在帖子中描述的那样),变量尊重xl。因此,您需要使用函数句柄来表示。更改=['@(x)'的{​​{1}}。

    1. 我不确定您是否知道这一点,但您几乎不使用代码的任何部分。您的代码可以减少到4行,它将完全相同。永远不会使用=['@(x,l)'Fs adn FS。:
    2. 您的代码的结果与:

      相同
      f

      因此,除非您稍后使用它做更多的事情,否则无需不必要地计算内容。