我正在尝试为我所在的数值分析类编写一个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