集成在一个恒定的函数上

Air*_*pet 10 matlab symbolic-math numerical-integration

我试图在MATLAB 2017a中集成一个常量函数,但我被卡住了.首先,当我使用以下脚本进行集成时,我得到了正确的输出.所以脚本适用于x0依赖的脚本t.

function E=sol(n,k)
x0 = @(t)  t^(2);
j = 0;
E = zeros(n,1);
 while j < n+1 ;
    K = matlabFunction(subs(po(j,k))) ; 
    eval(sprintf('x%d = integral(K,0,1);',j+1)) ;
    E(j+1,1) = subs(sprintf('x%d',j+1))
    j = j+1;
 end
end
Run Code Online (Sandbox Code Playgroud)

功能po(j,k)如下,

function A_j = po(j,k)          % Adomian polynomials
 if j >0
  x =  sym('x',[1 j]);
    syms p;                            % Assinging a symbolic variable for p
    syms x0;
    S = x0+ sum(p.^(1:j) .* x) ;     % Sum of p*x up to order j
    Q =f(S,k);                        % Taking the k-th power of S, i.e. 
    A_nc = diff(Q,p,j)/factorial(j);  % Taking the j-th order derivative 
    A_j = subs(A_nc,p,0) ;            % Filling in p=0
 else
    syms x0;
    S = x0; 
    A_j =f(S,k);                      % Taking the k-th power of S,
  end
 end 
Run Code Online (Sandbox Code Playgroud)

在哪里f(x,k),

function F = f(x,k) % Nonlinear function of k power
 F = x^k ;
end
Run Code Online (Sandbox Code Playgroud)

现在,当我调用sol(n,k)它确实有效.但是,当我尝试在常量函数中更改我的x0函数时sol(n,k),

function E=solcon(n,k)
x0 = @(t) 2.*ones(size(t));
j = 0;
E = zeros(n,1);
 while j < n+1 ;
    K = matlabFunction(subs(po(j,k))) ; 
    eval(sprintf('x%d = integral(K,0,1);',j+1)) ;
    E(j+1,1) = subs(sprintf('x%d',j+1))
    j = j+1;
 end
end
Run Code Online (Sandbox Code Playgroud)

它不起作用,你可以看到我添加*ones(size(t));只是为了使它成为一个功能t.但不幸的是,当我打电话时,它仍然无效

K = matlabFunction(subs(po(j,k))) ;
Run Code Online (Sandbox Code Playgroud)

我明白了

@()4.0
Run Code Online (Sandbox Code Playgroud)

然后我打电话时收到错误,

eval(sprintf('x%d = integral(K,0,1);',j+1)) 
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我尝试整合一个常量吗?

我打电话时得到的错误solcon(10,2)

Error using symengine>@()4.0
Too many input arguments.

Error in integralCalc/iterateScalarValued (line 314)
            fx = FUN(t);

Error in integralCalc/vadapt (line 132)
        [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 75)
    [q,errbnd] = vadapt(@AtoBInvTransform,interval);

Error in integral (line 88)
Q = integralCalc(fun,a,b,opstruct);

Error in solcon1 (line 7)
eval(sprintf('x%d = integral(K,0,1);',j+1)) ;
Run Code Online (Sandbox Code Playgroud)

编辑2我使用以下脚本,

function E=solcon(n,k)
x0 = @(t) 2.*ones(size(t));
j = 0;
E = zeros(n,1);
 while j < n+1 ;
    K = matlabFunction(subs(po(j,k))) ; 
    fstr= func2str(K)
    if fstr(3) == ')';
       x{j+1} = K*(1-0)
    else x{j+1} = integral(K,0,1)
    end
 E(j+1,1) = subs(x{j+1},1);
 j = j+1
 end
end
Run Code Online (Sandbox Code Playgroud)

但是发生以下错误,

Undefined operator '*' for input arguments of type 'function_handle'.
Error in solcone1 (line 9)
x{j+1} = K*(1-0);
Run Code Online (Sandbox Code Playgroud)

And*_*uri 11

我将忽略使用的可怕选择eval,特别是当你能做到的时候

x{j+1} = integral(K,0,1);
Run Code Online (Sandbox Code Playgroud)

阅读更多关于为什么动态变量和eval是可怕的


你的问题是matlabFunction聪明的.当它检测到你的函数没有任何依赖关系时x,它会为你提供一个空输入参数的函数@()4.0.如你所见,integral不喜欢那样.

解决问题的一种方法是在调用之前检测这个问题integral.您可以检查它是否有输入参数,如果没有,则"手动"评估积分

 ...
 while j < n+1 ;

    K = matlabFunction(subs(po(j,k))) ; 
    fstr=func2str(K);
    if fstr(3)==')'
         x{j+1}=K()*(1-0); % evaluate the integral yourself
    else
         x{j+1} = integral(K,0,1);
    end
    E(j+1,1) = subs(x{j+1});
    j = j+1;
 end
...
Run Code Online (Sandbox Code Playgroud)

尽管我是这样,但问题要困难得多.要么重写整个事物,要么使用eval:

 ...
 while j < n+1 ;

    K = matlabFunction(subs(po(j,k))) ; 
    fstr=func2str(K);
    if j==0
          eval(sprintf('x%d = K()*(1-0);;',j+1)) ;
    else
          eval(sprintf('x%d = integral(K,0,1);',j+1)) ;
    end
     E(j+1,1) = subs(sprintf('x%d',j+1));
    j = j+1;
 end
...
Run Code Online (Sandbox Code Playgroud)