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
答案 0 :(得分:2)
由于您的初始点是真实的,因此您的算法永远不会离开实轴。要查找复杂的根,您需要从复杂的点开始,例如X_initial = 1i
。
我建议您修改算法,从实际点开始一次,从复杂点开始,覆盖整个复杂平面。
此外,~ismember(root, Roots)
在浮点数的情况下过滤掉重复的根不起作用。你必须想出另一种方法来做到这一点。例如,计算从新获得的根到每个旧根的距离,如果它足够接近其中一个,则它可能是重复的,因此您可以丢弃它。
作为旁注,it is recommended not use "i" and "j" as variable names用于防止意外行为,尤其是在处理复杂数字时。