考虑以下 matlab 代码片段:
g = @(x, t)x.*0;
u_explizit = explizit_Euler(20, 800, 1, 1, zeros(21,1), g, [1;2], 0, 0.1);
figure
surf(u_explizit);
shading flat;
title('Aufgabe 2 - Explizit Euler');
u_implizit = implizit_Euler(20, 800, 1, 1, zeros(21,1), g, [1;2], 0, 0.1);
这两个函数都explizit_Euler
以implizit_Euler
相同的命令开始(此处显示为explizit_Euler
:
function [u] = explizit_Euler(n, nt, T, kappa, u0, f, b, gN, gD)
tau = T/nt;
[A, z] = prepare_system(n, f, b, gN, gD);
z = z';
...
end
该函数prepare_system
如下所示:
function [ A, z] = prepare_system(n, f, b, gN, gD)
%PREPARE_MATRIX_SYSTEM Prepares A_h and solution vector f_h
h = 1/n;
z = f((0:n)./n);
...
end
prepare_system
从内部调用explizit_Euler
就可以了。但是,来自内部的调用implizit_Euler
会传递一条错误消息,我就是不知道为什么:
Subscript indices must either be real positive integers or logicals.
Error in implizit_Euler (line 5)
z = f((0:n)./n);
似乎matlab认为f
是一个向量,因此它无法访问f(0)
,如果是一个向量,这是有道理f
的。而是f
一个函数句柄!为什么完全相同的代码在早期的代码中可以正常工作explizit_Euler
?