2011-02-07 3 views

ответ

2

Чтобы найти численные значения пересечений:

Создать анонимную функцию, которая равна нулю в точках пересечения между вашим решением и линии вы ищете:

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 по диапазону. Мы повторяем этот процесс, пока не достигнем удовлетворительной точности.

Одно предупреждение, однако, это только найдет один ноль в пределах начального диапазона, который вы предоставляете. Это фундаментальное расстройство с большинством методов поиска нуля и, в более общем плане, поле оптимизации, поиск нуля которого можно рассматривать как частный случай.

  • Если вам нужно больше о методе бисекций: http://en.wikipedia.org/wiki/Bisection_method
  • Если вам нужно больше нуля методов поиска, я бы искать в университетской библиотеке для книги по численному анализу.
  • Если вам нужно больше анонимных функций в Matlab (символ «= @ (т)», что я использовал), а затем проверить здесь: http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html

Я думаю, что покрывает его, удачи.

--Andrew

+0

Эмм ... хорошо ... как-то я не понимаю ... Я имею в виду - я никогда не найти, сколько X есть. Эмм. Как это должно быть для простой функции, такой как t = 0: .3: 10; y = sin (t); – Izumi

+0

Хорошо ... Эмм ... Ну, то, что вы написали, находит только одну точку пересечения, но оно выходит за интервал [0 2] и, очевидно, не находит другую точку пересечения, которая будет где-то около x = 1 , y = 0. – Izumi

+0

@lzumi, комментарий 1: Если вы хотели найти пересечения y = t и y = sin (t), вы искали бы нули функции z (t) = sin (t) - t. Вы должны создать анонимную функцию в matlab: z = @ (t) sin (t) - t; затем найдите t_zero = fzero (z, 0); – Sevenless

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

  • Нет связанных вопросов^_^