在Matlab中获取使积分为零的常数

Obtaining the constant that makes the integral equal to zero in Matlab

我正在尝试编写 MATLAB 程序,但我已经到了需要执行以下操作的地步。我有这个等式:

我必须找到常数 "Xcp" 的值(大于零),即使积分等于零的值。

为了做到这一点,我编写了一个循环,其中 Xcp 的值在每次迭代中以小增量递增,并且执行积分并检查它是否为零,如果它达到零,则循环结束并且Xcp 用这个值存储。

但是,我认为这不是完成此任务的有效方法。 运行ning时间增加很多,因为这个循环很长,每次都要进行积分,积分限制代换。

有没有更聪明的方法在 Matlab 中执行此操作以获得更好的代码效率?

P.S.: 我已经使用 conv() 来乘以两个多项式。由于 cl(x) 和 (x-Xcp) 都是多项式。

编辑: 一段代码。

p = [1 -Xcp];    % polynomial (x-Xcp)
Xcp=0.001;
i=1;
found=false;
while(i<=x_te && found~=true)      % Xcp is upper bounded by x_te
   int_cl_p = polyint(conv(cl,p));
   Cm_cp=(-1/c^2)*diff(polyval(int_cl_p,[x_le,x_te]));
   if(Cm_cp==0)
     found=true;
   else
     Xcp=Xcp+0.001;
   end
end

这是我用于 运行 这部分的代码。另一个问题是我必须针对不同的情况(不同的 cl 函数)执行此操作,因此代码更慢。

据我了解,您需要求解 X_CP 的方程式。 我建议为此使用符号求解器。对于大型多项式,这不是最有效的方法,但对于 20 次多项式,它需要不到 1 秒。我并不声称此解决方案是最快的,但这提供了 generic 问题解决方案。如果你的多项式每次迭代都不会改变,那么你可以多次使用这个通用解决方案,而不用花时间计算积分。

因此,根据 xLExTE 的通用符号解是使用以下方法获得的:

syms xLE xTE c x xCP
a = 1:20;
%//arbitrary polynomial of degree 20
cl = sum(x.^a.*randi([-100,100],1,20));
tic
eqn = -1/c^2 * int(cl * (x-xCP), x, xLE, xTE) == 0;
xCP = solve(eqn,xCP);
pretty(xCP)
toc

Elapsed time is 0.550371 seconds.

您可以进一步使用 matlabFunction 求数值解:

xCP_numerical = matlabFunction(xCP);
%// we then just plug xLE = 10 and xTE = 20 values into function
answer = xCP_numerical(10,20)
answer =  
        19.8038

对代码稍加修改即可让您将其用于通用系数。

希望对您有所帮助

如果乘以 -1/c^2,则可以重新排列为

并随心所欲地整合。由于 c_l 是多项式阶数 N,如果它在 MATLAB 中使用 polyval 的常用符号定义,其中系数存储在向量 a 中,使得

那么集成就很简单了:

MATLAB 代码可能如下所示

int_cl_p = polyint(cl);
int_cl_x_p = polyint([cl 0]);
X_CP = diff(polyval(int_cl_x_p,[x_le,x_te]))/diff(polyval(int_cl_p,[x_le,x_te]));