簡體   English   中英

matlab,我如何編寫一個聲明,讓我在y軸上從x = 0.3開始

[英]matlab, how do i write a statement that will give me time on xaxis from y=0.3

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請協助
謝謝

這里的一個關鍵問題是你的情節中有多個點,其中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');

在此輸入圖像描述

一個簡單的答案是:

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

如果在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=0 l (小寫L)只是選擇y的適當平方根。 我們需要正平方根,因此l=0 因此,您可以使用該函數獲取t的值或y的任何值的時間。

因此,使用您的示例, t(0.3,0,0)給出0.8291

編輯

我忘了解決方案有兩個分支可以給你真正的輸出(gnovice的回答讓我想起了這個)。 因此,對於這兩種解決方案,請使用

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

得出0.89213.9528

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

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

minDiff =

  3.9435e-004


index =

    84

 x(index)

ans =

    0.8300

除了已經發布的解決方案,我還要添加其他方法來解決問題:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM