2013-03-11 1 views
0
my_fun = z^3 - 1; 
my_deriv = 3*(z^2); 

Это те функции, которые я использовал. Я могу найти реальную часть своих решений, но когда я использую функцию, которая имеет мнимую часть для корня, такую ​​как функция выше, я не знаю, как ее найти. Мой код проходит через разные значения для моего начального значения, и если я нахожу корни, я его храню в своем массиве, и если он найдет корень уже в массиве, он игнорирует его. Поэтому я в основном задаюсь вопросом, могу ли я изменить свой код, чтобы найти корень с мнимой частью. ThanksКак найти сложную часть корня с использованием метода Ньютона-Рафсона в Matlab?

clc; 
close all; 
clear all; 

Roots = []; 
Array_slot = 1; 
threshold = 0.00000001; 
% X_initial = 1; 

for (j = -10:10) 
    X_initial = j; 
    if (my_deriv(X_initial) ~= 0) 
    counter = 0; 

    while (abs(my_fun(X_initial)) > threshold && counter < 100) 
     X_initial; 
%    imag(X_initial) 
     X_one = X_initial - (my_fun(X_initial)/my_deriv(X_initial)); 
     X_initial = X_one; 
%    imag(X_one) 
     counter = counter + 1; 

    end 
    if counter < 1000 
    root = (round(X_initial*1000))/1000; 

     if ~ismember(root,Roots) 

      Roots(Array_slot) = root; 
      Array_slot = Array_slot + 1; 
     end 
    end 
end 
end 

Roots 
+0

FYI, ваш код не подходит для 'z^3 - 1', так как он также имеет два воображаемых корня:' 0.5 * (1 ± i * sqrt (3)) ' –

+0

Да, я знал, что он не нашел мнимые части, и это была моя главная проблема с кодом, я изменил его на инициализацию с помощью реальных и сложных точек, спасибо –

ответ

2

Поскольку ваша начальная точка реальна, алгоритм никогда не покидает действительную ось. Чтобы найти сложные корни, вам нужно начать с сложной точки, например X_initial = 1i.

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

Кроме того, ~ismember(root, Roots) не делает отличной работы при фильтрации повторяющихся корней в случае чисел с плавающей запятой. Вам придется придумать другой способ сделать это. Например, вычислите расстояние от вновь полученного корня до каждого из старых корней, и если оно достаточно близко к одному из них, это, вероятно, дубликат, чтобы вы могли его отбросить.

В качестве примечания стороны, it is recommended not use "i" and "j" as variable names для предотвращения неожиданного поведения, особенно при работе с комплексными числами.