matlab,我如何编写一个声明,让我在y轴上从x = 0.3开始

时间:2011-04-07 17:07:24

标签: matlab

x=[0:.01:10];
y=(x.^2).*(exp(-x));

plot(x,y), grid
y1=max(y);

xlabel('TIME');
ylabel('CONCENTRATION IN BLOOD');
title('CONCENTRATIN OF SUSTANCE IN BLOOD vs TIME');

fprintf('(a) The maximum concentraion is %f \n',y1)

这是我的计划,而且我很难写一份声明给我时间,y=0.3请协助 谢谢

5 个答案:

答案 0 :(得分:4)

这里的一个关键问题是你的情节中有多个点y = 0.3。如果您想以简单的方式查找所有这些内容,可以按照以下步骤操作:

  • 从您的向量y中减去0.3,以便您要查找的点变为过零点。
  • 在上面的矢量中找到符号变化的索引。
  • 对于零交叉两侧的y值,计算值0.3所在的差值的百分比。这基本上在零交叉两侧的两点之间执行线性插值。
  • 使用上述百分比查找零交叉的x的相应值。

以下是代码以及显示找到的点的情节:

>> yDesired = 0.3;
>> index = find(diff(sign(y-yDesired)));
>> pctOfDiff = (yDesired-y(index))./(y(index+1)-y(index));
>> xDesired = x(index)+pctOfDiff.*(x(index+1)-x(index))

xDesired =

    0.8291    3.9528

>> plot(x,y);
>> hold on;
>> plot(xDesired,yDesired,'r*')
>> xlabel('x');
>> ylabel('y');

enter image description here

答案 1 :(得分:1)

一个简单的答案是:

find(min(abs(y- 0.3))== abs(y- 0.3))

ans = 84

从而

x(84)
ans = 0.83000

现在,如果您在x中提高分辨率,您还可以找到更接近分析分辨率的解决方案。

> x=[0.5:.000001:1]; y=(x.^2).*(exp(-x));
> x(find(min(abs(y- 0.3))== abs(y- 0.3)))
ans =  0.82907

修改
并且为了找到所有的零而言:

> x=[0:.01:10]; y=(x.^2).*(exp(-x));
2> find(abs(y- 0.3)< 1e-3)
ans =
    84   396
> x(find(abs(y- 0.3)< 1e-3))
ans =
   0.83000   3.95000

答案 2 :(得分:1)

如果在MATLAB中有符号工具箱,则可以执行以下操作

syms x
x=solve('x^2*exp(-x)=y')

x=
  (-2)*lambertw(k, -((-1)^l*y^(1/2))/2)

此处lambertwy=x*exp(x)的解决方案,可在MATLAB中作为函数使用。因此,您现在可以将函数定义为

t=@(y,k,l)(-2)*lambertw(k, -((-1)^l*y^(1/2))/2)

lambertw是一个具有多个分支的多值函数。变量k允许您选择解决方案的分支。您需要主分支,因此k=0l(小写L)只是选择y的适当平方根。我们需要正平方根,因此l=0。因此,您可以使用该函数获取t的值或任何y值的时间。

因此,使用您的示例,t(0.3,0,0)会提供0.8291

修改

我忘了解决方案有两个分支可以给你真正的输出(gnovice的回答让我想起了这个)。因此,对于这两种解决方案,请使用

t(0.3,[0,-1],0)

提供0.89213.9528

答案 3 :(得分:0)

查找索引(以及x值)的更简单方法是:

[minDiff, index] = min(abs(y-0.3))

minDiff =

  3.9435e-004


index =

    84

 x(index)

ans =

    0.8300

答案 4 :(得分:0)

除了已经发布的解决方案,我还会添加其他方法来解决问题:

f = @(x) (x.^2).*(exp(-x));             %# function handle
y0 = 0.3;

format long

%# find root of function near s0
x1 = fzero(@(x)f(x)-y0, 1)              %# find solution near x=1
x2 = fzero(@(x)f(x)-y0, 3)              %# find solution near x=3

%# find minimum of function in range [s1,s2]
x1 = fminbnd(@(x)abs(f(x)-y0), 0, 2)    %# find solution in the range x∈[0,2]
x2 = fminbnd(@(x)abs(f(x)-y0), 2, 4)    %# find solution in the range x∈[2,4]