在Matlab

时间:2015-12-11 07:31:26

标签: matlab math integration

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

Equation 1

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

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

但是,我认为这不是执行此任务的有效方法。运行时间增加很多,因为这个循环很长并且每次都要执行积分和积分限制替换。

在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函数)执行此操作,因此代码更慢。

2 个答案:

答案 0 :(得分:1)

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

因此,使用以下方法获得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 :(得分:1)

如果乘以c_l,则可以重新排列为 \int_{x_{LE}}^{x_{TE}}c_l(x)x dx = X_{CP} \int_{x_{LE}}^{x_{TE}}c_l(x) dx \ X_{CP}=\frac{{\int_{x_{LE}}^{x_{TE}}c_l(x)x dx}{{\int_{x_{LE}}^{x_{TE}}c_l(x) dx}}

并整合但你喜欢。由于N是多项式阶数a,如果它在MATLAB中使用polyval的常用符号定义,其中系数存储在向量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])); 中,以便 c_l(x) = \sum_{i=1}^{N+1} a_i x^{N+1-i},

然后整合很简单: \int c_l(x)dx = \sum_{i=1}^{N+1} \frac{a_i}{N+2-i} x^{N+2-i},\ \int c_l(x)x\,dx = \sum_{i=1}^{N+1} \frac{a_i}{N+3-i} x^{N+3-i}.

MATLAB代码可能看起来像这样

return