循环不 return 修正分段函数的值
Loop does not return correct values for piecewise function
我曾尝试编写一个代码,作为更大程序的一部分,它会在 s
的每个点上 return 值 z
。但是,当我 运行 代码时,我只得到 z=0
,或者如果最后一个 else
被忽略,代码 returns 零向量。
有人知道我哪里出错了吗?我使用了这个 source 中的方法 1。任何帮助将不胜感激,几个月来我一直在努力完成这项工作。
% clc;close all; %// not generally appreciated
%initial values
b=1.25;
h=0.313;
%define the s coordinate
s= 0:0.001:2*(b+h);
%create zero matrix for speed
z=zeros(size(s));
%calculate z at every point of s coordinate
for i =length(s)
if 0 <= s(i) && s(i) <=b %0<=s<=b
z=0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %b<=s<=(b+h)
z=0.5*h+((-0.5*h)/(b+h-b))*(s-b);
elseif b <= s(i) && s(i) <=(b+h) %(h+b)<=s<=(b+h)
z=-0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %(h+2b)<=s<=(2b+2h)
z=-0.5*h+((-0.5*h)/(b+h-b))*(s-b);
else z=0;
end
end
为了进一步参考,这解决了我的问题。谢谢@Dan!
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// Create z
z = zeros(size(s));
idx1 = 0 <= s & s <=b;
idx2 = b <= s & s <=(b+h);
idx3 = (b+h) <= s & s <= (2*b+h);
idx4 = (2*b+h) <= s & s <=(2*b+2*h);
z(idx1) = 0.5*h;
z(idx2) = 0.5*h+((-0.5*h-0.5*h)/(b+h-b))*(s(idx2)-b);
z(idx3) = -0.5*h;
z(idx4) =-0.5*h+((0.5*h+0.5*h)/((2*b+2*h-b)-(h+b+b)))*(s(idx4)-b)
b=1.25;
h=0.313;
%define the s coordinate
s= 0:0.001:2*(b+h);
%create zero matrix for speed
z=zeros(size(s));
%calculate z at every point of s coordinate
for ii =1:length(s)
if 0 <= s(ii) && s(ii) <=b %0<=s<=b
z(ii)=0.5*h;
elseif b <= s(ii) && s(ii) <=(b+h) %b<=s<=(b+h)
z(ii)=0.5*h+((-0.5*h)/(b+h-b))*(s(ii)-b);
elseif b <= s(ii) && s(ii) <=(b+h) %(h+b)<=s<=(b+h)
z(ii)=-0.5*h;
elseif b <= s(ii) && s(ii) <=(b+h) %(h+2b)<=s<=(2b+2h)
z(ii)=-0.5*h+((-0.5*h)/(b+h-b))*(s(ii)-b);
else z(ii)=0;
end
end
让您的 for
循环 运行 超过 1 次迭代,因此 for ii = 1:length(s)
。
使用每个元素分配,因此 z(ii) = some function
Don't use i
as a variable.
您的代码存在很多问题。您需要分配给 z
的索引,否则您每次都会过度使用标量(即 z(i)=...
)。您需要遍历一个向量,因此 fori=1:length(s)
和您的最后三个循环条件相同!
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// create zero matrix for speed
z=zeros(size(s));
%// calculate z at every point of s coordinate
for i = 1:length(s)
if 0 <= s(i) && s(i) <=b %// 0<=s<=b
z=0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %// b<=s<=(b+h)
z(i)=0.5*h+((-0.5*h)/(b+h-b))*(s-b);
elseif (b+h) <= s(i) && s(i) <= (2*b+h) %// (h+b)<=s<=(2b+h)
z(i)=-0.5*h;
elseif (2*b+h) <= s(i) && s(i) <=(2*b+2*h) %// (h+2b)<=s<=(2b+2h)
z(i)=-0.5*h+((-0.5*h)/(b+h-b))*(s-b);
else z(i)=0;
end
end
综上所述,在 MATLAB 中,您甚至根本不需要循环来执行此操作,通常最好不要使用循环:
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// Create z
z = zeros(size(s));
idx1 = 0 <= s && s <=b;
idx2 = b <= s && s <=(b+h);
idx3 = (b+h) <= s && s <= (2*b+h);
idx4 = (2*b+h) <= s && s <=(2*b+2*h);
z(idx1) = 0.5*h;
z(idx2) = 0.5*h+((-0.5*h)/(b+h-b))*(s(idx2)-b);
z(idx3) = -0.5*h;
z(idx4) = -0.5*h+((-0.5*h)/(b+h-b))*(s(idx4)-b);
我曾尝试编写一个代码,作为更大程序的一部分,它会在 s
的每个点上 return 值 z
。但是,当我 运行 代码时,我只得到 z=0
,或者如果最后一个 else
被忽略,代码 returns 零向量。
有人知道我哪里出错了吗?我使用了这个 source 中的方法 1。任何帮助将不胜感激,几个月来我一直在努力完成这项工作。
% clc;close all; %// not generally appreciated
%initial values
b=1.25;
h=0.313;
%define the s coordinate
s= 0:0.001:2*(b+h);
%create zero matrix for speed
z=zeros(size(s));
%calculate z at every point of s coordinate
for i =length(s)
if 0 <= s(i) && s(i) <=b %0<=s<=b
z=0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %b<=s<=(b+h)
z=0.5*h+((-0.5*h)/(b+h-b))*(s-b);
elseif b <= s(i) && s(i) <=(b+h) %(h+b)<=s<=(b+h)
z=-0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %(h+2b)<=s<=(2b+2h)
z=-0.5*h+((-0.5*h)/(b+h-b))*(s-b);
else z=0;
end
end
为了进一步参考,这解决了我的问题。谢谢@Dan!
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// Create z
z = zeros(size(s));
idx1 = 0 <= s & s <=b;
idx2 = b <= s & s <=(b+h);
idx3 = (b+h) <= s & s <= (2*b+h);
idx4 = (2*b+h) <= s & s <=(2*b+2*h);
z(idx1) = 0.5*h;
z(idx2) = 0.5*h+((-0.5*h-0.5*h)/(b+h-b))*(s(idx2)-b);
z(idx3) = -0.5*h;
z(idx4) =-0.5*h+((0.5*h+0.5*h)/((2*b+2*h-b)-(h+b+b)))*(s(idx4)-b)
b=1.25;
h=0.313;
%define the s coordinate
s= 0:0.001:2*(b+h);
%create zero matrix for speed
z=zeros(size(s));
%calculate z at every point of s coordinate
for ii =1:length(s)
if 0 <= s(ii) && s(ii) <=b %0<=s<=b
z(ii)=0.5*h;
elseif b <= s(ii) && s(ii) <=(b+h) %b<=s<=(b+h)
z(ii)=0.5*h+((-0.5*h)/(b+h-b))*(s(ii)-b);
elseif b <= s(ii) && s(ii) <=(b+h) %(h+b)<=s<=(b+h)
z(ii)=-0.5*h;
elseif b <= s(ii) && s(ii) <=(b+h) %(h+2b)<=s<=(2b+2h)
z(ii)=-0.5*h+((-0.5*h)/(b+h-b))*(s(ii)-b);
else z(ii)=0;
end
end
让您的 for
循环 运行 超过 1 次迭代,因此 for ii = 1:length(s)
。
使用每个元素分配,因此 z(ii) = some function
Don't use i
as a variable.
您的代码存在很多问题。您需要分配给 z
的索引,否则您每次都会过度使用标量(即 z(i)=...
)。您需要遍历一个向量,因此 fori=1:length(s)
和您的最后三个循环条件相同!
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// create zero matrix for speed
z=zeros(size(s));
%// calculate z at every point of s coordinate
for i = 1:length(s)
if 0 <= s(i) && s(i) <=b %// 0<=s<=b
z=0.5*h;
elseif b <= s(i) && s(i) <=(b+h) %// b<=s<=(b+h)
z(i)=0.5*h+((-0.5*h)/(b+h-b))*(s-b);
elseif (b+h) <= s(i) && s(i) <= (2*b+h) %// (h+b)<=s<=(2b+h)
z(i)=-0.5*h;
elseif (2*b+h) <= s(i) && s(i) <=(2*b+2*h) %// (h+2b)<=s<=(2b+2h)
z(i)=-0.5*h+((-0.5*h)/(b+h-b))*(s-b);
else z(i)=0;
end
end
综上所述,在 MATLAB 中,您甚至根本不需要循环来执行此操作,通常最好不要使用循环:
%// initial values
b=1.25;
h=0.313;
%// define the s coordinate
s= 0:0.001:2*(b+h);
%// Create z
z = zeros(size(s));
idx1 = 0 <= s && s <=b;
idx2 = b <= s && s <=(b+h);
idx3 = (b+h) <= s && s <= (2*b+h);
idx4 = (2*b+h) <= s && s <=(2*b+2*h);
z(idx1) = 0.5*h;
z(idx2) = 0.5*h+((-0.5*h)/(b+h-b))*(s(idx2)-b);
z(idx3) = -0.5*h;
z(idx4) = -0.5*h+((-0.5*h)/(b+h-b))*(s(idx4)-b);