【问题标题】:Matlab solution for two graphs两个图的matlab解决方案
【发布时间】:2013-09-23 20:06:24
【问题描述】:

我有一个函数 f(t) 并希望得到它与 y=-1 和 y=1 在 0 到 6*pi 范围内相交的所有点。 我冷做它的唯一方法是绘制它们并尝试找到 f(t) 与 y=1 图相交的 x 轴 pt。但这并没有给我确切的观点。反而给了我一个近乎的价值。

clear;
clc;
f=@(t) (9*(sin(t))/t) + cos(t);
fplot(f,[0 6*pi]);
hold on; plot(0:0.01:6*pi,1,'r-');
         plot(0:0.01:6*pi,-1,'r-');
         x=0:0.2:6*pi; h=cos(x); plot(x,h,':')

【问题讨论】:

    标签: matlab plot solution equation-solving


    【解决方案1】:

    您实际上是在尝试求解一个由两个方程组成的系统,至少在一般情况下是这样。对于其中一个方程是常数的简单情况,因此 y = 1,我们可以使用 fzero 求解它。当然,使用图形方式找到一个好的起点总是一个好主意。

    f=@(t) (9*(sin(t))./t) + cos(t);
    y0 = 1;
    

    这个想法是,如果你想找到两条曲线相交的地方,就是将它们相减,然后寻找结果差的根。

    (顺便注意一下,我使用了./进行除法,这样MATLAB在f中输入向量或数组就不会出现问题了。这是养成的好习惯。)

    请注意,f(t) 在 MATLAB 中并未严格定义为零,因为它导致 0/0。 (该功能当然存在限制,可以使用我的limest 工具进行评估。)

    limest(f,0)
    ans =
               10
    

    因为我知道解不是 0,所以我将使用 fzero 边界从那里寻找根。

    format long g
    fzero(@(t) f(t) - y0,[eps,6*pi])
    ans =
              2.58268206208857
    

    但这是唯一的根吗?如果我们有两个或多个解决方案怎么办?找到一个完全一般函数的所有根可能是一个令人讨厌的问题,因为一些根可能无限接近,或者可能有无限多个根。

    一个想法是使用一个知道如何为一个问题寻找多种解决方案的工具。同样,在文件交换上找到,我们可以使用research

    y0 = 1;
    rmsearch(@(t) f(t) - y0,'fzero',1,eps,6*pi)
    ans =
              2.58268206208857
              6.28318530717959
              7.97464518075547
              12.5663706143592
              13.7270312712311
    
    y0 = -1;
    rmsearch(@(t) f(t) - y0,'fzero',1,eps,6*pi)
    ans =
              3.14159265358979
              5.23030501095915
              9.42477796076938
              10.8130654321854
               15.707963267949
              16.6967239156574
    

    【讨论】:

    • 感谢您花时间向我解释解决方案。
    【解决方案2】:

    试试这个:

    y = fplot(f,[0 6*pi]);
    

    现在您可以分析y 以获得您正在寻找的价值。

    [x,y] = fplot(f,[0 6*pi]);
    [~,i] = min(abs(y-1));
    point = x(i);
    

    这将找到一个最近的交叉点。否则,您将使用 for 遍历向量

    【讨论】:

    • 谢谢。但我想要的是我的 f(t) 与 y=1 线相交时的对应点。
    • 我得到的点是 1.0179,这显然不是我的函数与 y=1 线相交的地方。
    • 找到y=1行前后的点,然后用interp1进行插值,找到y=1对应的值。
    • 我已经修好了 - 晚上太晚了:/
    【解决方案3】:

    这是我经常使用的带有for的变体:

    clear;
    clc;
    f=@(t) (9*(sin(t))/t) + cos(t);
    fplot(f,[0 6*pi]);
    [fx,fy] = fplot(f,[0 6*pi]);
    hold on; plot(0:0.01:6*pi,1,'r-');
             plot(0:0.01:6*pi,-1,'r-');
             x=0:0.2:6*pi; h=cos(x); plot(x,h,':')
    
    k  = 1; % rising 
    kt = 1; % rising
    pn = 0; % number of crossings
    fy = abs(fy-1);
    for n = 2:length(fx)
        if fy(n-1)>fy(n)
            k = 0; % falling
        else
            k = 1; % rising
        end
    
        if k==1 && kt ==0 % change from falling to rising
            pn = pn +1;
            p(pn) = fx(n);
        end
        kt = k;
    end
    

    如果你制作这个的 mex 文件,你可以让它更快......

    【讨论】:

      猜你喜欢
      • 2021-07-05
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2012-03-31
      相关资源
      最近更新 更多