0
my_fun = z^3 - 1;
my_deriv = 3*(z^2);

这些是我使用的功能。我可以找到我的解决方案的实部,但是当我使用一个对根具有虚部的函数(例如上面的函数)时,我不知道如何找到它。我的代码为我的初始值遍历不同的值,如果我找到一个根,我将它存储在我的数组中,如果它在数组中找到一个根,它会忽略它。所以我基本上想知道我是否可以更改我的代码以找到具有虚部的根。谢谢

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
4

1 回答 1

2

由于您的初始点是真实的,因此您的算法永远不会离开实轴。要找到复数根,您需要从复数点开始,例如X_initial = 1i

我建议你修改你的算法,从一个实点开始,一次从复点开始,以覆盖整个复平面。

此外,~ismember(root, Roots)在浮点数的情况下,在过滤掉重复根方面做得不好。你必须想出另一种方法来做到这一点。例如,计算从新获得的根到每个旧根的距离,如果它与其中一个足够接近,则它可能是重复的,因此您可以丢弃它。

附带说明一下,建议不要使用“i”和“j”作为变量名,以防止出现意外行为,尤其是在处理复数时。

于 2013-03-11T15:40:41.407 回答