Why am I not able to run this code?
4 views (last 30 days)
Show older comments
global mat1 mat2
mat1=[
1 -2 1 0 0 0 0 0 0 0;
0 1 -2 1 0 0 0 0 0 0;
0 0 1 -2 1 0 0 0 0 0;
0 0 0 1 -2 1 0 0 0 0;
0 0 0 0 1 -2 1 0 0 0;
0 0 0 0 0 1 -2 1 0 0;
0 0 0 0 0 0 1 -2 1 0;
0 0 0 0 0 0 0 1 -2 1;
];
mat2 = [
1 -1 0 0 0 0 0 0 0 0;
0 1 -1 0 0 0 0 0 0 0;
0 0 1 -1 0 0 0 0 0 0;
0 0 0 1 -1 0 0 0 0 0;
0 0 0 0 1 -1 0 0 0 0;
0 0 0 0 0 1 -1 0 0 0;
0 0 0 0 0 0 1 -1 0 0;
0 0 0 0 0 0 0 1 -1 0;
];
x0 = [1 0 0 0 0 0 0 0 0 0]';
tspan = 0:0.01:5;
f0 = fun(0, x0);
joptions = struct('diffvar', 2, 'vectvars', 1, 'thresh', 1e-8, 'fac', []);
J = odenumjac(fun,{0 x0}, f0, joptions);
sparsity_pattern = sparse(J~=0.);
options = odeset('Stats', 'on', 'JPattern', sparsity_pattern);
ttic = tic();
[t, sol] = ode15s(@(t,x) fun(t,x), tspan , x0); %, options);
ttoc = toc(ttic)
fprintf('runtime %f seconds ...\n', ttoc)
plot(t, sol)
function f = fun(t,x)
global mat1 mat2
f(1,1) = 0;
f(2:9,1) = mat1*x + mat2*x;
f(10,1) = 2*(x(end-1) - x(end));
end
I've defined the `options` for `odenumjac` and it still throws the error
Not enough input arguments.
Am I missing something?
0 Comments
Answers (1)
KALYAN ACHARJYA
on 18 Feb 2021
Here
J = odenumjac(fun,{0 x0}, f0, joptions);
^..............^ function without input arguments
11 Comments
KALYAN ACHARJYA
on 19 Feb 2021
Edited: KALYAN ACHARJYA
on 19 Feb 2021
For this issue
Error in Untitled>fun (line 47)
f(2:9,1) = mat1*x + mat2*x;
Once I tried to reproduce the error with a little modification to the function file, I could not find any such issue. Note that here I only partially executed the main code upto the following line
f0 = fun(0, x0);
Function file: Input t is not used within the function
function f = fun(~,x)
global mat1 mat2
f(1,1) = 0;
f(2:9,1) = mat1*x + mat2*x;
f(10,1) = 2*(x(end-1) - x(end));
end
Walter Roberson
on 19 Feb 2021
joptions = struct('diffvar', 2, 'vectvars', 1, 'thresh', 1e-8, 'fac', []);
That 'vectvars', 1 option says that your function is vectorized over the first variable, t,
% ODENUMJAC takes advantage of vectorization, i.e., when several values F
% can be obtained with one function evaluation. Set OPTIONS.VECTVAR
% to the indices of vectorized arguments: VECTVAR = [2] indicates that
% F(t,[x1 y2 ...]) returns [F(t,x1) F(t,x2) ...], while VECTVAR = [1,2]
% indicates that F([t1 t2 ...],[x1 x2 ...]) returns [F(t1,x1) F(t2,x2) ...].
So you have declared that it an pass in multiple t values and the function will return a result for each of the t values -- but your code does not in fact handle that situation.
See Also
Categories
Find more on Whos in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!