Matlab Newton的方法代码

时间:2015-06-16 12:52:35

标签: matlab

我正在尝试为我所在的数值分析类编写一个Matlab代码。我们要创建一个名为' picture'的矩阵。它对应于1000×1000阵列,它均匀地覆盖复平面中的正方形[-1,1] x [-1,1]。必须将这1000000个点中的每一个与函数f(x)= x ^ 3 + 1(其为1,(1 + sqrt(3)i)/ 2和(1-sqrt(3)i)的根进行比较)/ 2,我相信)。使用牛顿法和1000000点中的每一个作为我们的初始近似,我们应该得到每个点处函数根的近似值。然后,如果标准(近似根减去3个实际根中的一个)小于用户定义的公差,我们在1000 x 1000阵列中将该点作为4个颜色代码中的一个:0,20,40或60。每个点(和相应的近似根)将是不同的颜色,取决于它最接近的实际根 我一直在研究这段代码,我不能更具体地解决我的问题,因为我根本不知道我哪里出错了。我附上了我的代码,希望有人可能会阅读它并看到一个可怕的(但很容易解决的)错误!每次运行代码时,我都会得到一个巨大的零矩阵。

function [] = coloredroots()
nPoints = 1000;

picture = zeros(nPoints, nPoints);

for a = 1 : nPoints
    for b = 1 : nPoints
        double z;
        z = (-1 + (a*0.002)) + 1i*(-1 + (b*0.002));  %%z is complex number,0.002 is the    %%increment size that allows 1000 steps between -1 and 1

f = @(x) (x^3) + 1;   %%the function we are finding the roots of
fprime = @(x) 3*(x^2);
nmax = 100;   %%maximum number of iterations of Newton's method
error= 10^(-1);    %%user-created max error
tolerance = 10^(-1);    %%how close we want the approx roots to be to the actual roots, %% also user-created
double code;

    root = newton(f, fprime, (-1 + (a*(0.002))), nmax, error);
    code = getColorCode(root, tolerance);
    picture(a,b) = code;  %%storing the color code found using initial approximation of %%point (a,b) into the matrix 'picture' in row a, column b
end
end

image(picture)
print('plot_coloredroots', '-dpng');  
%%My teacher instructed us to include these 2 above lines although I am yet to define a      %%plot 

function [x] = newton(f, fprime, x, nmax, error)

for n = 1:nmax
    d = f(x)/fprime(x);
    x = x - d;
    if abs(d) < error
        return
    end
end
end

function [c] = getColorCode(root, tolerance)
if norm(root - 1.0) < tolerance
    c = 20;
elseif norm(root - (0.5*sqrt(3)*1i - 0.5)) < tolerance
    c = 40;
elseif norm(root - (-0.5*sqrt(3)*1i - 0.5)) < tolerance
    c = 60;
else
    c = 0;
end
end
end       

0 个答案:

没有答案