Вы можете продолжить вдоль массива t
и искать точки, где значения меняющих знак. Это указывает на наличие нуля.
Actaully, функция fzero
MATLAB использует аналогичный метод. Вы сказали, что вы не использовали, потому что вам требуется массив, а не анонимная функции, но вы могли бы преобразовать массив в анонимную функцию с помощью простой линейной интерполяции так:
func = @(k) interp1(x,t,k); % value of t(x) interpolated at x=k
fzero(func,initial_value);
EDIT: Просто, чтобы уточнить, что я имею в виду. Если у вас есть массив t
, и вы хотите, чтобы найти нули ...
f = 5; % frequency of wave in Hz
x = 0:0.01:1; % time index
t = cos(2*pi*f*x); % cosine wave of frequency f
zeroList = []; % start with an empty list of zeros
for i = 2:length(t) % loop through the array t
current_t = t(i); % current value of t
previous_t = t(i-1); % previous value of t
if current_t == 0 % the case where the zero is exact
newZero = x(i);
zeroList = [zeroList,newZero];
elseif current_t*previous_t < 0 % a and b have opposite sign if a*b is -ve
% do a linear interpolation to find the zero (solve y=mx+b)
slope = (current_t-previous_t)/(x(i)-x(i-1));
newZero = x(i) - current_t/slope;
zeroList = [zeroList,newZero];
end
end
figure(1); hold on;
axis([ min(x) max(x) -(max(abs(t))) (max(abs(t))) ]);
plot(x,t,'b');
plot(x,zeros(length(x)),'k-.');
scatter(zeroList,zeros(size(zeroList)),'ro');
нули я получаю правильно:
Я согласен здесь. +1 – rayryeng
Ницца, он работает. Есть ли способ найти все нули в заданном интервале, например [0 2pi]? или я должен сделать цикл и попробовать разные промежутки? – Abolfazl
Я бы перебирал все элементы массива и имел переменную, которая запоминает предыдущий элемент. Если текущий и предыдущие элементы отличаются знаком, вы нашли нуль. – eigenchris