在這里,我((2*x.^2 3*exp(-x) -(100*a)).*sin(5*x))./(6*x.^2-9*x-42)-10用 input繪制了a=3, dx=0.1。
我想用藍色繪制所有正 y 值,用紅色繪制所有負 y 值:

a = input('Please input a: ');
dx = input('Input step size dx: ');
if dx<0
fprintf('dx must be a non-negative number.');
while(dx<0)
dx = input('Input step size dx: ');
end
end
clf;
x = -10:dx:10;
y = ((2*x.^2 3*exp(-x) -(100*a)).*sin(5*x))./(6*x.^2-9*x-42)-10
plot(x,y)
ylim([-100,100])
為了繪制藍色的正 y 值和紅色的負 y 值,我嘗試為正 y 值及其域初始化向量,并為負 y 值及其域初始化相同的向量。
s = size(y);
x_1 = [];
x_2 = []; %negative
y_1 = [];
y_2 = []; %negative
for i = 1:s(2)
if(y(i) >0)
x_1 = [x_1,x(i)];
y_1 = [y_1,y(i)];
elseif (y(i) <0)
x_2 = [x_2,x(i)];
y_2 = [y_2,y(i)];
end
end
s_x1 = size(x_1);
s_x1_lim = s_x1(2);
s_x2 = size(x_2);
s_x2_lim = s_x2(2);
plot(x_1,y_1,'b');
xlim([x_1(1), s_x1_lim]);
hold on
plot(x_2,y_2,'r');
xlim([x_2(1), s_x2_lim]);
hold on;
xlim([-10,10])
ylim([-100,100]);
問題是,這種方法留下了一些我不希望有的重疊。我怎樣才能改變這個?

uj5u.com熱心網友回復:
您可以制作兩個陣列:neg_x = x; neg_x (neg_x >0) = nan使用繪圖'r',然后使用相反的正值繪制。然而,這將給您留下兩個陣列之間的部分,即您的間隙。您可以通過找到它們并將索引擴展一來糾正它們:
x = 0:0.1:6*pi;
y = sin(x);
neg_y = y; neg_y (neg_y>0) = nan;
tmp_y = isnan(neg_y);
idx = find(diff(tmp_y)==1); % find gaps
neg_y(idx 1) = y(idx 1); % correct gaps
idx = find(diff(tmp_y)==-1);
neg_y(idx) = y(idx);
pos_y = y; pos_y (pos_y<0) = nan;
plot(x, neg_y,'r');
hold on;
plot(x,pos_y,'b')
使用nan在這里有點幫助,因為 MATLAB 在繪圖時會自動忽略這些條目,即留下一個很好的間隙,而不是一條直線。
結果是:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/467371.html
下一篇:顯示總和為N的所有素數對
