3

関数 f(t) があり、0 から 6*pi の範囲で y=-1 および y=1 と交差するすべての点を取得したいと考えています。私が冷静に行う唯一の方法は、それらをプロットし、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,':')
4

3 に答える 3

2

少なくとも一般的には、基本的に 2 つの連立方程式を解こうとしています。方程式の 1 つが定数であり、したがって y = 1 である単純なケースでは、fzero を使用して解くことができます。もちろん、適切な出発点を見つけるためにグラフィカルな手段を使用することは常に良い考えです。

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

2 つの曲線が交差する場所を見つけたい場合は、それらを減算し、結果の差の根を探します。

(ちなみに、除算に ./ を使用したことに注意してください。これにより、MATLAB で f のベクトルまたは配列の入力に問題が発生しなくなります。これは開発するのに適した習慣です。)

f(t) は、0/0 になるため、MATLAB ではゼロで厳密に定義されていないことに注意してください。(関数にはもちろん制限があり、limestツールを使用して評価できます。)

limest(f,0)
ans =
           10

解が 0 ではないことはわかっているので、そこから根を探して fzero 境界を使用します。

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

しかし、これは唯一のルートですか?解が 2 つ以上ある場合はどうなるでしょうか。完全に一般的な関数のすべての根を見つけることは厄介な問題になる可能性があります。いくつかの根が無限に接近している場合や、無限に多くの根が存在する場合があるためです。

1 つのアイデアは、問題に対する複数の解決策を探す方法を知っているツールを使用することです。繰り返しますが、ファイル交換で見つかったので、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
于 2013-09-24T14:46:08.340 に答える
0

これを試して:

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

yこれで、探している値を分析できます。

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

これにより、最も近い交差点が 1 つ見つかります。それ以外の場合は、ベクトルを通過しますfor

于 2013-09-23T20:15:51.253 に答える