3

I have a function f(t) and want to get all the points where it intersects y=-1 and y=1 in the range 0 to 6*pi. The only way I cold do it is ploting them and trying to locate the x-axis pt where f(t) meets the y=1 graph. But this doesn't give me the exact point. Instead gives me a near by value. This is how I am getting the points.

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,':')
4

3 回答 3

2

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

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

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

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

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

limest(f,0)
ans =
           10

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

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

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

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

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
于 2013-09-24T14:46:08.340 回答
0

这是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文件,你可以让它更快......

于 2013-09-24T12:55:34.643 回答
0

尝试这个:

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

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

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

这将找到一个最近的交叉点。否则你会通过向量for

于 2013-09-23T20:15:51.253 回答