我正在尝试编写MATLAB程序,我已经到了需要执行以下操作的位置。我有这个等式:
我必须找到常量“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函数)执行此操作,因此代码更慢。
答案 0 :(得分:1)
据我所知,你需要解决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 :(得分:1)
并整合但你喜欢。由于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]));
中,以便
MATLAB代码可能看起来像这样
return