在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 问题解决方案。如果你的多项式每次迭代都不会改变,那么你可以多次使用这个通用解决方案,而不用花时间计算积分。
因此,根据 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 中使用 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]));
我正在尝试编写 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 问题解决方案。如果你的多项式每次迭代都不会改变,那么你可以多次使用这个通用解决方案,而不用花时间计算积分。
因此,根据 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 中使用 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]));