Чтобы найти численные значения пересечений:
Создать анонимную функцию, которая равна нулю в точках пересечения между вашим решением и линии вы ищете:
sol = dsolve('D3y-4*D2y+Dy+2*y=0,y(0)=-4,Dy(0)=-6,D2y(0)=-4');
my_func = @(x) subs(sol,'t',x) - x; % Your solution - x is equal to zero at the %intersections
тогда, если вы хотите, чтобы графические данные находили значения:
plot(-5:.01:5,my_func(-5:.01:5))
или численно, путем оптимизации рутина:
x = fzero(my_func,0); % I find x = -.6847
, который будет искать нуля функции вблизи 0. Это не будет найти все нули, так что вам нужно будет запустить функцию fzero вблизи значений где вы ожидаете, что пересечения будут.
Надеется, что это помогает,
Эндрю
редактирует: а как метода бисекций.
Как только у нас есть анонимная одномерная функция «my_func», если вы не хотите использовать метод оптимизации для решения уравнения, но знаете диапазон [range_ {min} range_ {max}], в котором my_func = 0, то следующий алгоритм будет найти нуль функции для вас, если вы работаете с непрерывной функцией:
range_min = 0; % say our range is [0 2]
range_max = 2;
error_tolerance = .0001; % will find the answer to within .0001
while (range_max - range_min < error_tolerance)
range_temp = (range_max + range_min)/2;
if ((my_func(range_temp) <0 & my_func(range_max)>0) | (my_func(range_temp) >0 & my_func(range_max)<0))
range_min = range_temp;
else if ((my_func(range_min)<0 & my_func(range_temp)>0) | (my_func(range_min)>0 & my_func(range_temp)<0))
range_max = range_temp;
else if (my_func(range_temp == 0)
range_min = range_temp;
range_max = range_temp;
end
end
t_intersection = (range_min + range_max)/2;
Так какое-то объяснение: если функция непрерывна, и у вас, то если он пересекает y = t при t_intersection, то при нашей измененной функции my_func (t) = sol (t) -t будет иметь нуль при t_пересечении. Поскольку my_func является непрерывным, мы можем найти нуль функции, если мы знаем два значения функции: одно больше нуля и единицы, которое меньше нуля.
Итак, мы начинаем с этих известных точек и определяем диапазон [range_min range_max], где либо my_func (range_min) < 0, либо my_func (range_max)> 0 или наоборот. Затем мы сокращаем этот диапазон пополам, создавая среднюю точку range_temp = mean (range_min и _max). Теперь мы создаем новый диапазон [range_temp range_max] или [range_min range_temp], чтобы сохранить знак изменения my_func по диапазону. Мы повторяем этот процесс, пока не достигнем удовлетворительной точности.
Одно предупреждение, однако, это только найдет один ноль в пределах начального диапазона, который вы предоставляете. Это фундаментальное расстройство с большинством методов поиска нуля и, в более общем плане, поле оптимизации, поиск нуля которого можно рассматривать как частный случай.
Я думаю, что покрывает его, удачи.
--Andrew
Эмм ... хорошо ... как-то я не понимаю ... Я имею в виду - я никогда не найти, сколько X есть. Эмм. Как это должно быть для простой функции, такой как t = 0: .3: 10; y = sin (t); – Izumi
Хорошо ... Эмм ... Ну, то, что вы написали, находит только одну точку пересечения, но оно выходит за интервал [0 2] и, очевидно, не находит другую точку пересечения, которая будет где-то около x = 1 , y = 0. – Izumi
@lzumi, комментарий 1: Если вы хотели найти пересечения y = t и y = sin (t), вы искали бы нули функции z (t) = sin (t) - t. Вы должны создать анонимную функцию в matlab: z = @ (t) sin (t) - t; затем найдите t_zero = fzero (z, 0); – Sevenless