Why am I not able to run this code?

3 visualizzazioni (ultimi 30 giorni)
Deepa Maheshvare
Deepa Maheshvare il 18 Feb 2021
Commentato: Walter Roberson il 19 Feb 2021
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?

Risposte (1)

KALYAN ACHARJYA
KALYAN ACHARJYA il 18 Feb 2021
Here
J = odenumjac(fun,{0 x0}, f0, joptions);
^..............^ function without input arguments
  11 Commenti
KALYAN ACHARJYA
KALYAN ACHARJYA il 19 Feb 2021
Modificato: KALYAN ACHARJYA il 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
Walter Roberson il 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.

Accedi per commentare.

Categorie

Scopri di più su Loops and Conditional Statements in Help Center e File Exchange

Prodotti


Release

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by