我有一个函数f(t),想要得到它在0到6 * pi的范围内与y = -1和y = 1相交的所有点。 我冷的唯一方法是绘制它们并尝试定位x轴pt,其中f(t)与y = 1图形相交。但这并没有给我确切的观点。而是给我一个接近的价值。
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,':')
答案 0 :(得分:2)
你本质上是试图解决两个方程的系统,至少在一般情况下。对于其中一个方程是常数,因此y = 1的简单情况,我们可以使用fzero求解它。当然,使用图形方法找到一个好的起点总是一个好主意。
f=@(t) (9*(sin(t))./t) + cos(t);
y0 = 1;
这个想法是,如果你想找到两条曲线相交的位置,就是减去它们,然后寻找产生差异的根。
(顺便说一句,请注意我使用./作为除法,因此MATLAB对于f中的向量或数组输入没有问题。这是一个很好的习惯。)
注意,在MATLAB中没有严格定义f(t)为零,因为它导致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
答案 1 :(得分:0)
试试这个:
y = fplot(f,[0 6*pi]);
现在您可以分析y
了解您要查找的值。
[x,y] = fplot(f,[0 6*pi]);
[~,i] = min(abs(y-1));
point = x(i);
这将找到一个最近的交叉点。另外,您使用for
答案 2 :(得分: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文件,你可以加快速度......