OCTAVE - 绘制来自 2 个函数的值

OCTAVE - plot values from 2 functions

您好, 我在制作有关数字积分的 Octave 脚本时遇到问题。 我有 3 个功能:第一个计算 Heuler 积分; 2、计算Heun Integration;第三个应该在同一个 window.

中一起绘制 heuler 和 heun 的折线图

问题是第一个和第二个函数工作得很好,但是第三个函数 previsao() 无论我做什么总是抛出错误: A(I,J):列索引越界;值 1 越界 0 第 124 行第 7 列的预览

124行是这个: plt1 = plot(eul(:,x),eul(:,ti),heu(:,x),heu(:, ti));

这里是heuler的代码

function e = euler(x,ti,tf,h,fDerivada)

 xInicial = x;
 tInicial = ti;
 contador = 0;

 % inicia array na posição 1 a 0
  x(1) = 0;
 t(1) = 0;

 while(tInicial <= tf)

% implementa o método de Euler
xFinal = xInicial;
funcao = fDerivada(tInicial, xInicial);
xInicial = xInicial + h * funcao;

% insere valores nos arrays x e t e vai incrementando de posição no array
% vai dar origem à matriz com t e x 
x(contador + 1) = xInicial;
t(contador + 1) = tInicial;

tInicial = tInicial + h;

contador++;

 endwhile

 printf("\n");
 disp("Metodo de Euler:");
 % escreve a matriz em colunas
 [t', x']

 %gráfico 
 plt = plot(x);
 set(plt(1),"linewidth",2);
 set(plt(1),"color","r");
 xlabel("Tempo");
ylabel("Var dependente x");
title("Heuler");
legend("x");

 endfunction

Heun 函数

function h = heun(x, ti, tf, h, fDerivada)

 xInicial = x;
 tInicial = ti;
 media = h/2;
 contador = 0;

 % inicia array na posição 1 a 0
 x(1) = 0;
 t(1) = 0;

while(tInicial <= tf)

% implementa o método de heun
xFinal = xInicial;
funcao = fDerivada(tInicial, xInicial);
% previsor
previsor = xInicial + h * funcao;
% cálculo com corretor
% var media = h/2
corretor = xInicial + media * (funcao + fDerivada(tInicial + h, previsor));

% insere valores nos arrays x e t e vai incrementando de posição no array
% vai dar origem à matriz com t e x 
x(contador + 1) = corretor;
t(contador + 1) = tInicial;

tInicial = tInicial + h;

contador++;

endwhile

printf("\n");
disp("Metodo de Heun:");
% escreve a matriz em colunas
[t', x']

% gráfico 
plt = plot(x);
set(plt(1),"linewidth",2);
set(plt(1),"color","r");
grid;
xlabel("Tempo");
ylabel("Var dependente x");
title("Heun");
legend("x");

endfunction

有问题的函数

它应该在同一个图上绘制 euler 和 heun 图 window

previsao函数

function previsao(x, ti, tf, h, fDerivada)

% chama ambas as funções
% remover o ponto e virgula para fazer saida da matriz t, x
eul = euler(x,ti,tf,h,fDerivada);
heu = heun(x,ti, tf, h, fDerivada);

% gráfico comparativo entre ambas
plt1 = plot(eul(:,x),eul(:,ti),heu(:,x),heu(:,ti));
set(plt1(1),"linewidth",2);
set(plt1(1),"color","g");
set(plt1(2),"linewidth",2);
set(plt1(2),"color","r");
grid;
xlabel("var independente t");
ylabel("Var dependente x");
title("Metodos de integracao");
legend("Heuler","Heun");

endfunction

非常感谢您提供可能的解决方案...

调试此类问题的典型方法是启用 debug_on_error

debug_on_error(1);

再次运行你的脚本。这次它将在 previsao 中停止并显示 debug> 提示符。现在你可以安装 "eul" 和 "heu",例如第一步是

size(eul)
size(heu)
x
ti

那么问题出在哪里应该很明显了。对于未来:请尝试将您的问题分解为您遇到问题的重要部分,而不是 "Here is my workspace with x files"。如果可以将代码复制并粘贴到解释器并且没有帮助的人可以看到问题,它总是有帮助的。在你的情况下,我必须弄清楚 x、ti、tf、h、fDerivada 需要哪些值才能 运行 你的函数。

编辑:您的函数

function e = euler(x,ti,tf,h,fDerivada)

没有写 return 值,所以在这种情况下显然 eul 是 [],我确定 Octave 会发出警告,对吗?顺便说一句,你不应该覆盖内置函数,比如 e、pi、i....