algorithm - 下标索引必须是小于 2^31 的正整数或逻辑
问题描述
SOS 我在有限差分法的循环求解中不断出错。
当我开始时,我会收到以下错误i = 2 : N
:
diffusion: A(I,J): row index out of bounds; value 2 out of bound 1
error: called from
diffusion at line 37 column 10 % note line change due to edit!
或者,当我这样做时出现以下错误i = 2 : N
:
subscript indices must be either positive integers less than 2^31 or logicals
error: called from
diffusion at line 37 column 10 % note line change due to edit!
请帮忙
clear all; close all;
% mesh in space
dx = 0.1;
x = 0 : dx : 1;
% mesh in time
dt = 1 / 50;
t0 = 0;
tf = 10;
t = t0 : dt : tf;
% diffusivity
D = 0.5;
% number of nodes
N = 11;
% number of iterations
M = 10;
% initial conditions
if x <= .5 && x >= 0 % note, in octave, you don't need parentheses around the test expression
u0 = x;
elseif
u0 = 1-x;
endif
u = u0;
alpha = D * dt / (dx^2);
for j = 1 : M
for i = 1 : N
u(i, j+1) = u(i, j ) ...
+ alpha ...
* ( u(i-1, j) ...
+ u(i+1, j) ...
- 2 ...
* u(i, j) ...
) ;
end
u(N+1, j+1) = u(N+1, j) ...
+ alpha ...
* ( ...
u(N, j) ...
- 2 ...
* u(N+1, j) ...
+ u(N, j) ...
) ;
% boundary conditions
u(0, :) = u0;
u(1, :) = u1;
u1 = u0;
u0 = 0;
end
% exact solution with 14 terms
%k=14 % COMMENTED OUT
v = (4 / ((k * pi) .^ 2)) ...
* sin( (k * pi) / 2 ) ...
* sin( k * pi * x ) ...
* exp .^ (D * ((k * pi) ^ 2) * t) ;
exact = symsum( v, k, 1, 14 );
error = exact - u;
% plot stuff
plot( t, error );
xlabel( 'time' );
ylabel( 'error' );
legend( 't = 1 / 50' );
解决方案
看看我在上面为你清理的编辑代码并研究它。在寻找错误时,不要低估干净、可读的代码的重要性。它将为您节省更多的时间而不是成本。尤其是从现在开始的一周后,当您需要重新访问此代码时,您将完全不记得您正在尝试做什么。
现在关于你的错误。(所有行引用都与上面的清理代码有关)
场景一:
在第 29 行中,您将初始化u
为单个值。
如果您从第 35 行开始循环i = 2
,那么一旦您尝试执行u(i, j+1)
,即u(2,2)
在下一行中,octave 就会抱怨您正在尝试索引第二行,该数组目前仅包含一行. (事实上,此时 j 同样适用,因为此时您也只有一列)
场景二:
我认为第二种情况是一个错字,你的意思是说i = 1 : N
. 如果您从i=1
循环开始,请查看第 38 行:您正在尝试获取 element u(i-1, j)
,即u(0,1)
. 因此 octave 会抱怨您试图获取零元素,但在 octave 数组中,数组从1开始并且未定义零。尝试使用零访问任何数组将导致您看到错误(在终端中尝试!)。
更新
此外,既然代码是干净的,您可以发现另一个错误,如果您尝试运行代码,该 octave 会有效地警告您。
看第 26 行。在elseif
腿中没有条件,所以 octave 寻找下一条语句作为测试条件。
这意味着elseif
只要 u0 = 1-x 的结果不为零,条件将始终成功。
这显然是一个错误。要么您忘记为 设置条件elseif
,或者更可能的是,您可能只是想说else
,而不是elseif
。
推荐阅读
- java - JFrame 表单 - Java 返回:1 | 构建失败
- android - 使用 android spinner 适配器时崩溃
- ios - 如何从 QR 码生成器中删除灰色框架
- angular - 将 typescript 变量传递给 svg image href 属性
- python - 如何将字符串拆分为 2 个单词的不同片段,其中第二个片段的第一个单词重复第一个单词的最后一个单词
- reactjs - 在子组件中反应警告不受控制的组件
- google-apps-script - 0Auth2 问题在我的谷歌表中获取我的谷歌照片库
- python - 在 Django 中使用 select 小部件从 Postgres 数据库中获取数据
- java - 如何修复 java.lang.NullPointerException:Bukkit 插件中的 null?
- reactjs - 为“无限”参数设置反应路由器