我开始编程并选择octave couse它是免费的"版本" matlab,他们在我大学使用的程序。
因此,当我尝试运行我的代码时,这些问题出现了:
错误:I(0):下标必须是整数1到(2 ^ 31)-1或逻辑
我不知道为什么,因为当我用R代替 RR 时,代码可以正常工作。
我想也许问题是 R-Rn 并不是真正等于0,而是接近它,因此问题就是问题,但在用简单数字进行一些测试之后,我发现了它实际上是0,但也许它对于矩阵来说是不同的
请帮忙。
哦,不要注意巴西的笔记。
clear
tic %inicio da cronometragem
f = @(x) 16*x.^6 + 8*x -6; %definir função
df = @(x) 96*x.^5 + 8; %definir derivada da função
tol = 10E-4; %define a tolerancia
xmin = -5; %menor valor para X
xmax = 5; %maior valor para X
ymin = -5; %menor valor para Y
ymax = 5; %maior valor para Y
npx = 8; %número de pontos do eixo X
npy = 8; %número de pontos do eixo Y
dx = (xmax-xmin)/npx; %calculo da distância entre os
pontos do eixo X
dy = (ymax-ymin)/npy; %calculo da distância entre os
pontos do eixo Y
A = zeros(npy+1, npx+1); %define matriz cheia de 0, do
tamanho definido por npx e npy
x = xmin:dx:xmax; %define tamanho e distancia entre os pontos de uma linha
y= ymin:dy:ymax; %define tamanho e distancia entre os pontos de uma coluna
A = x+i*y'; %preenche a matriz A com os valores desta multiplicação
[m n] = size(A); %define m e n como o tamanho da linha e coluna, respectivamente, da matriz A
I = zeros(m,n); %cria outra matriz, I, de mesmo tamanho de A, mas cheia de 0
i = 0; %numero de interações definido como 0
R = I;
for kk = 1:50 %define numero de interações do metodo de newton
An = A-f(A)./df(A); %método de newton
i = i + 1; %aumentar o numero de interação a cada vez que repete
Rn = R
R = abs((An - A)) < tol %cria uma matriz R com 1 ou 0 se a posição alcançou a tolerancia ou não
RR = R - Rn
I(RR) = i %preenche a matriz I com o numero de interação de cada posição da matriz A
A = An; %iguala A com An para que o metodo de newton possa continuar
end
imagesc(I) %forma o fractal
toc %para o cronômetro
答案 0 :(得分:2)
它适用于R,因为R是一个逻辑数组 - 使用逻辑数组索引接受0作为值,因为逻辑数组索引中的0表示'不适用于此元素'。
当你减去你的数组Rn时,RR变成一个双精度数组。以这种方式索引不能接受0,因为没有第0个元素。
您需要将RR转换为逻辑数组(函数在MATLAB中为'逻辑')才能生效。
答案 1 :(得分:1)
当我运行代码时,我得到的RR全部为零。在MATLAB中,索引从1开始(因此零是无效索引)。尝试将RR = R - Rn
更改为RR = R - Rn + 1
。这至少让代码运行并生成图像(虽然我不确定图像是否正确)。