通过摆脱循环来简化函数的最佳方法是什么?
$uid = uniqid().date("Ymdhhis");
有没有办法使用任何类似矢量的解决方案而不是function Q = gs(f, a, b)
X(4) = sqrt((3+2*sqrt(6/5))/7);
X(3) = sqrt((3-2*sqrt(6/5))/7);
X(2) = -sqrt((3-2*sqrt(6/5))/7);
X(1) = -sqrt((3+2*sqrt(6/5))/7);
W(4) = (18-sqrt(30))/36;
W(3) = (18+sqrt(30))/36;
W(2) = (18+sqrt(30))/36;
W(1) = (18-sqrt(30))/36;
Q = 0;
for i = 1:4
W(i) = (W(i)*(b-a))/2;
X(i) = ((b-a)*X(i)+(b+a))/2;
Q = Q + W(i) * f(X(i));
end
end
循环?
答案 0 :(得分:3)
sum
是你最好的朋友。此外,声明一些常量和创建向量很有用:
function Q = gs(f, a, b)
c = sqrt((3+2*sqrt(6/5))/7);
d = sqrt((3-2*sqrt(6/5))/7);
e = (18-sqrt(30))/36;
g = (18+sqrt(30))/36;
X = [-c -d d c];
W = [e g g e];
W = ((b - a) / 2) * W;
X = ((b - a)*X + (b + a)) / 2;
Q = sum(W .* f(X));
end
请注意,MATLAB喜欢处理逐个元素的操作,所以关键是用for
和W
中的所有元素来缩放最后的X
循环循环中看到的缩放因子。此外,使用逐元素乘法(.*
)是关键。这当然假设f
可以以元素方式处理事物。如果没有,则无法避免for
循环。
我强烈建议您在开始MATLAB之旅之前咨询关于元素操作的MATLAB教程:https://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html