注册 登录
编程论坛 Matlab

matlab菜鸟提问,画分段函数的曲线,请大家帮助,急

beyond8820 发布于 2006-06-12 10:46, 9608 次点击
毕业论文题目, 做一个分段函数曲线。刚刚接触matlab,照葫芦画瓢,没画好,请大家指点。
clear;
n=input('请输入斜面模数的值:');
%输入x1到x2n-1的值,暂定斜面数n为10
x1=input('请输入x1的值:');
x2=input('请输入x2的值:');
x3=input('请输入x3的值:');

%输入斜面倾角的值
angle1=input('请输入斜面倾角1的值:');
angle2=input('请输入斜面倾角2的值:');

%输入送进量的值(m)
s=input('请输入送进量的值:');

%坯料曲线
x=0:10000;
if(0<x&x<x1)
y=tan(angle1)*x;
plot(x,y,'r-'),hold on
elseif(x1<x&x<x2)
y=tan(angle1)*x1;
plot(x,y,'r-'),hold on
end

x1 、x2、angle1都是由用户输入。可是执行的时候,并不画图。请教这个分段函数该怎么写才正确
19 回复
#2
zhangenter2006-06-12 14:05
坯料曲线那段改为:
for x=0:0.1:x1
y=tan(angle1)*x;
plot(x,y,'r-');hold on
end
for x=x1:0.1:x2
y=tan(angle1)*x1;
plot(x,y,'r-');hold on
end
#3
beyond88202006-06-12 14:40

谢谢你的回答:)

在一个for语句里添加if字段不行么?原来的程序为什么错误呢?

#4
beyond88202006-06-12 14:45
还有。 画出的图,为什么y的值都是负的呢?这样,得出的曲线变化范围就不对了呀

超超菜鸟。问的简单,见笑了。
#5
zhangenter2006-06-12 15:19
angle1=input('请输入斜面倾角1的值:');
angle2=input('请输入斜面倾角2的值:');
出现负的可能是,这两个参数输入的时候你是不是以角度输入而不是以弧度输入的.
例如要输入30度角的话,要输入pi*1/6(或者0.5236),你不能输入成30
#6
zhangenter2006-06-12 15:31
以下是引用beyond8820在2006-6-12 14:40:19的发言:


谢谢你的回答:)

在一个for语句里添加if字段不行么?原来的程序为什么错误呢?

可以的,
for x=0:0.1:10000;
if(0<x&x<x1)
y=tan(angle1)*x;
plot(x,y,'r-');hold on
elseif(x1<x&x<x2)
y=tan(angle1)*x1;
plot(x,y,'r-');hold on
end
end
效果一样,

你那种写法x是一组1到10000,它们中既有大于x1和x2的也有小于x1和x2的数,
在判断你的if语句的时候,(0<x&x<x1)和(x1<x&x<x2)两句都不正确,所以这两个假设下的程序都不执行了,

[此贴子已经被作者于2006-6-12 15:46:04编辑过]

#7
beyond88202006-06-12 15:53
没错。输入的是30。嘿嘿
那分段函数,不可以在一个for语句中实现么?
另外,如果用for x=0:0.1:x1,那得出的曲线上,曲线是虚线,如果设置步长小些,如0.01,可以得到实心曲线,不过画图的速度实在很慢。

对于一个画图程序
x=1:10;
y=sin(x) ;这个程序来讲,虽然步长是1,但是画出的曲线就是实心的。我要这个程序里y随x变化的曲线是连续的实心线。是不是可以不把x的范围放到for语句里去设定?
#8
beyond88202006-06-12 16:30
再问:

把两段曲线画在一个图框内,第一个曲线,根据上面的for语句可以画出来,但是第二个曲线,x坐标的范围和第一个曲线相同。只是当x在不同范围的时候,y的值不同。例如
for x=0:0.1:10000
if x>0&x<s
y=c-t
elseif x>s&x<s+x1
y=tan(angle1)*c
end
end

这个曲线又怎样和上述 所说的第一个曲线在一个坐标系内画出来呢???
#9
zhangenter2006-06-12 16:53
以下是引用beyond8820在2006-6-12 15:53:30的发言:
没错。输入的是30。嘿嘿
那分段函数,不可以在一个for语句中实现么?
另外,如果用for x=0:0.1:x1,那得出的曲线上,曲线是虚线,如果设置步长小些,如0.01,可以得到实心曲线,不过画图的速度实在很慢。

对于一个画图程序
x=1:10;
y=sin(x) ;这个程序来讲,虽然步长是1,但是画出的曲线就是实心的。我要这个程序里y随x变化的曲线是连续的实心线。是不是可以不把x的范围放到for语句里去设定?

y(10000)=0;
for x=1:x1
y(x)=tan(angle1)*x;
end
for x=x1:x2
y(x)=tan(angle1)*x1;
end
plot(y)
步长1,实心线

#10
beyond88202006-06-12 17:00
谢谢你

把两段曲线画在一个图框内,第一个曲线,根据上面的for语句可以画出来,但是第二个曲线,x坐标的范围和第一个曲线相同。只是当x在不同范围的时候,y的值不同。例如
for x=0:0.1:10000
if x>0&x<s
y=c-t
elseif x>s&x<s+x1
y=tan(angle1)*c
end
end

这个曲线又怎样和上述 所说的第一个曲线在一个坐标系内画出来呢???

这个问题呢? 头大了。最关键的问题
#11
zhangenter2006-06-12 17:10
以下是引用beyond8820在2006-6-12 16:30:17的发言:
再问:

把两段曲线画在一个图框内,第一个曲线,根据上面的for语句可以画出来,但是第二个曲线,x坐标的范围和第一个曲线相同。只是当x在不同范围的时候,y的值不同。例如
for x=0:0.1:10000
if x>0&x<s
y=c-t
elseif x>s&x<s+x1
y=tan(angle1)*c
end
end

这个曲线又怎样和上述 所说的第一个曲线在一个坐标系内画出来呢???

for x=0:0.1:10000
if x>0&x<s
y=c-t;
plot(x,y);
elseif x>s&x<s+x1
y=tan(angle1)*c;
plot(x,y);
end
end
就可以了

#12
beyond88202006-06-12 17:14
不知道引用怎么用的。不过
for x=0:0.1:10000
if x>0&x<s
y=c-t;
plot(x,y);
elseif x>s&x<s+x1
y=tan(angle1)*c;
plot(x,y);
end
end
这样不行呀。因为是两条曲线。s有可能大于x1。两条曲线,第一条的x是在0到x1之间变化,第二条的x是在0到s,s到s+x1的区间变化。这两条曲线,每个阶段的曲线表示方法是不一样的。 不能简单用上述过程来描述
#13
zhangenter2006-06-12 17:17
plot(y)不行,plot(x,y)是可以的你确定用的plot(x,y)还不行吗?
还有前面的hold on你没丢吧

[此贴子已经被作者于2006-6-12 17:20:19编辑过]

#14
beyond88202006-06-12 17:24
看了一下书,plot(x,y,x1,y1)这个是可以在一个坐标系里画两条曲线的。不过对于x和x1可以分段取值的这个,在程序里不知道怎么表示比较好。
#15
beyond88202006-06-12 17:28
实际上就是要求两个分段函数曲线在一个坐标系里画出的问题。

#16
beyond88202006-06-12 18:00
不会做。。。。。。。。。。。matlab不是两天就能看会的。。。。。。。
#17
zhangenter2006-06-12 18:47
y(10000)=0;
for x=1:x1
y(x)=tan(angle1)*x;
end
for x=x1:x2
y(x)=tan(angle1)*x1;
end
plot(y);hold on;
…………
…………
…………
for x=1:s
y(x)=c-t;
end
for x=s:s+x1
y(x)=tan(angle1)*c;
end
plot(y)
这样画不会出问题的
#18
beyond88202006-06-13 08:51
试试看先:)
#19
beyond88202006-06-13 09:50
照葫芦画瓢。现在没太多时间了。我想了一下,干脆分开画两条曲线

%坯料曲线
for x=0:0.1:100;
if(0<x&x<x1)
y=tan(angle1*pi/180)*x;
plot(x,y,'m');hold on
elseif(x1<x&x<x2)
y=tan(angle2*pi/180)*x1;
plot(x,y,'m');hold on
end
end

%模具曲线
for m=0:0.1:100;
if(0<m&m<s)
y=c-t;
plot(m,y,'b');hold on
elseif(s<m&m<x1+s)
y=c+tan(angle2*pi/180)*(m-s)-t;
plot(m,y,'b');hold on
end
end

可以直接画出两个分段曲线
#20
beyond88202006-06-13 10:27
暂时没有问题了。多谢你:)
1