对常数函数进行积分
Integrating over a constant function
我试图在 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
其中函数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
而 f(x,k)
是
function F = f(x,k) % Nonlinear function of k power
F = x^k ;
end
现在,当我调用 sol(n,k)
时,它确实有效。但是当我尝试在 sol(n,k)
中更改 x0
中的常量函数时,
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
它不起作用,如您所见,我添加了 *ones(size(t));
只是为了使其成为 t
的函数。但不幸的是,当我打电话时它仍然不起作用,
K = matlabFunction(subs(po(j,k))) ;
我明白了,
@()4.0
然后我调用时出现错误,
eval(sprintf('x%d = integral(K,0,1);',j+1))
谁能帮我尝试对常数求积分?
调用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)) ;
编辑 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
但是出现如下错误,
Undefined operator '*' for input arguments of type 'function_handle'.
Error in solcone1 (line 9)
x{j+1} = K*(1-0);
我将忽略使用 eval
的糟糕选择,尤其是当您可以使用
时
x{j+1} = integral(K,0,1);
你的问题是 matlabFunction
是个聪明人。当它检测到您的函数对 x
没有任何依赖性时,它会为您提供一个输入参数为空的函数 @()4.0
。如您所见,integral
不喜欢这样。
解决问题的一种方法是在调用 integral
之前检测到这一点。您可以检查它是否有输入参数,如果没有,则计算积分 "by hand"
...
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
...
这个问题比我想象的要难得多。要么重写整个东西,要么使用 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
...
我试图在 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
其中函数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
而 f(x,k)
是
function F = f(x,k) % Nonlinear function of k power
F = x^k ;
end
现在,当我调用 sol(n,k)
时,它确实有效。但是当我尝试在 sol(n,k)
中更改 x0
中的常量函数时,
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
它不起作用,如您所见,我添加了 *ones(size(t));
只是为了使其成为 t
的函数。但不幸的是,当我打电话时它仍然不起作用,
K = matlabFunction(subs(po(j,k))) ;
我明白了,
@()4.0
然后我调用时出现错误,
eval(sprintf('x%d = integral(K,0,1);',j+1))
谁能帮我尝试对常数求积分?
调用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)) ;
编辑 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
但是出现如下错误,
Undefined operator '*' for input arguments of type 'function_handle'.
Error in solcone1 (line 9)
x{j+1} = K*(1-0);
我将忽略使用 eval
的糟糕选择,尤其是当您可以使用
x{j+1} = integral(K,0,1);
你的问题是 matlabFunction
是个聪明人。当它检测到您的函数对 x
没有任何依赖性时,它会为您提供一个输入参数为空的函数 @()4.0
。如您所见,integral
不喜欢这样。
解决问题的一种方法是在调用 integral
之前检测到这一点。您可以检查它是否有输入参数,如果没有,则计算积分 "by hand"
...
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
...
这个问题比我想象的要难得多。要么重写整个东西,要么使用 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
...