Why am I not able to run this code?
Afficher commentaires plus anciens
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?
Réponses (1)
KALYAN ACHARJYA
le 18 Fév 2021
Here
J = odenumjac(fun,{0 x0}, f0, joptions);
^..............^ function without input arguments
11 commentaires
Deepa Maheshvare
le 18 Fév 2021
Modifié(e) : Deepa Maheshvare
le 18 Fév 2021
Walter Roberson
le 18 Fév 2021
J = odenumjac(@fun,{0 x0}, f0, joptions);
Deepa Maheshvare
le 18 Fév 2021
Walter Roberson
le 18 Fév 2021
toolbox/matlab/funfun/private/odenumjac.m % Private to funfun
public use of odenumjac seem to disappear after 2008. The function still exists but it is private now.
KALYAN ACHARJYA
le 18 Fév 2021
Is that function "odenumjac" MATLAB inbuilt ?
Deepa Maheshvare
le 18 Fév 2021
Deepa Maheshvare
le 18 Fév 2021
Modifié(e) : Deepa Maheshvare
le 18 Fév 2021
Walter Roberson
le 18 Fév 2021
which -all odenumjac
You will see it in a /private directory. Copy it to your working directory.
You might need other functions from the same directory.
Deepa Maheshvare
le 18 Fév 2021
KALYAN ACHARJYA
le 19 Fév 2021
Modifié(e) : KALYAN ACHARJYA
le 19 Fév 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
le 19 Fév 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.
Catégories
En savoir plus sur Ordinary Differential Equations dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!