在Matlab中求取积分等于零的常数

在Matlab中求取积分等于零的常数,matlab,math,integration,Matlab,Math,Integration,我正试图编写一个MATLAB程序,我已经到了需要做以下工作的地步。我有一个等式: 我必须找到常数“Xcp”(大于零)的值,也就是使积分等于零的值 为了做到这一点,我编写了一个循环,在这个循环中,Xcp的值在每次迭代中以小的增量前进,执行积分并检查它是否为零,如果它达到零,循环结束,Xcp与这个值一起存储 然而,我认为这不是一个有效的方法来完成这项任务。运行时间增加了很多,因为这个循环很长,每次都需要执行积分和积分限制替换 有没有更聪明的方法在Matlab中实现这一点,以获得更好的代码效率 注:

我正试图编写一个MATLAB程序,我已经到了需要做以下工作的地步。我有一个等式:

我必须找到常数“Xcp”(大于零)的值,也就是使积分等于零的值

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

然而,我认为这不是一个有效的方法来完成这项任务。运行时间增加了很多,因为这个循环很长,每次都需要执行积分和积分限制替换

有没有更聪明的方法在Matlab中实现这一点,以获得更好的代码效率

注:我使用了
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
p=[1-Xcp];%多项式(x-Xcp)
Xcp=0.001;
i=1;
发现=错误;

而(i据我所知,你需要解X_CP的方程。 我建议使用符号解算器。对于大型多项式,这不是最有效的方法,但对于阶数为20的多项式,它只需要不到1秒的时间。我并不认为此解决方案最快,但它提供了问题的通用解决方案。如果多项式没有每次迭代都更改,则可以使用此方法通解多次,无需花费时间计算积分

因此,根据
xLE
xTE
获得通用符号解,使用以下公式:

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中使用通常的表示法定义,其中系数存储在向量
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]));

最好的方法是借助矢量化来实现这一点。显示您的代码,我们将尽力帮助您!您可以重新排列并从积分中取出Xcp,得到Xcp=A/B,其中A=integral(x*cl(x))和B=integral(cl(x))这是一个好主意,谢谢@dmuir+1,这是符号工具箱的一个很好的应用程序。我建议使用subs代替matlabFunction来计算它。这样你就不会失去精度。非常感谢。我将这样做,因为它变得更有效,我的多项式是9次的,所以它会更快。谢谢你的帮助。使用多项式积分的符号解算器是一个耻辱。当方程是线性的时,使用另一个解算器来获取未知值是另一个耻辱。@Yvesdao如果你很聪明,请建议你的解决方案。请将你的屈尊评论放在threadFollow@Steve之外,并使用int[a,b]x^kdx=(b^(k+1)-a^(k+1))/(k+1).你得到了一个封闭的公式,不需要软件。