2013-09-23 2 views
3

У меня есть функция f (t) и вы хотите получить все точки, где она пересекает y = -1 и y = 1 в диапазоне от 0 до 6 * pi. Единственный способ, которым я холод, это нарисовать их и попытаться найти ось x pt, где f (t) соответствует графику y = 1. Но это не дает мне точного момента. Вместо этого дает мне приблизительную ценность. This is how I am getting the points.Решение Matlab для двух графиков

clear; 
clc; 
[email protected](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,':') 

ответ

2

Вы по существу пытаетесь решить систему двух уравнений, по крайней мере, в общем. Для простого случая, когда одно из уравнений является константой, таким образом, y = 1, мы можем решить ее с помощью fzero. Конечно, всегда полезно использовать графические средства для поиска хорошей отправной точки.

[email protected](t) (9*(sin(t))./t) + cos(t); 
y0 = 1; 

Идея заключается в том, если вы хотите, чтобы найти, где две кривые пересекаются, чтобы вычесть их, а затем посмотреть на корень из полученной разницы.

(Кстати, обратите внимание, что я использовал для ./ разрыва, так что MATLAB не будет проблемой для вектора или входного массива в ф. Это хорошая привычка развиваться.)

Обратите внимание, что 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 
+0

Спасибо, что нашли время, объяснив мне решение. – camelbrush

0

Попробуйте это:

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

теперь вы можете анализировать y для значения вы ищете.

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

это найдет один из ближайших пунктов пересечения границы. Otherwhise вы собираетесь через вектор с for

+0

спасибо. но то, что я хочу, это соответствующие точки, когда мой f (t) пересекает линию y = 1. – camelbrush

+0

Точка, которую я получаю, равна 1.0179, что явно не там, где моя функция пересекает линию y = 1. – camelbrush

+0

Найдите точку до и после строки y = 1, а затем интерполируйте с помощью 'interp1', чтобы найти соответствующее значение для' y = 1'. – am304

0

Вот вариант с for я часто использую:

clear; 
clc; 
[email protected](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-файл этого ...

+0

спасибо лот. +1 для хорошей альтернативной идеи. – camelbrush

Смежные вопросы