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

複素平面全体をカバーするために、実点から 1 回、複素点から 1 回開始するようにアルゴリズムを修正することをお勧めします。

さらに、~ismember(root, Roots)浮動小数点数の場合、重複するルートを除外するのに優れた仕事をしません。別の方法を考え出す必要があります。たとえば、新しく取得したルートから古いルートのそれぞれまでの距離を計算し、それらのいずれかに十分近い場合は、おそらく重複しているため、破棄できます。

補足として、特に複素数を扱う場合は、予期しない動作を防ぐために変数名として「i」と「j」を使用しないことをお勧めします。

于 2013-03-11T15:40:41.407 に答える