Why am I not able to run this code?
Mostrar comentarios más antiguos
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?
Respuestas (1)
KALYAN ACHARJYA
el 18 de Feb. de 2021
Here
J = odenumjac(fun,{0 x0}, f0, joptions);
^..............^ function without input arguments
11 comentarios
Deepa Maheshvare
el 18 de Feb. de 2021
Editada: Deepa Maheshvare
el 18 de Feb. de 2021
Walter Roberson
el 18 de Feb. de 2021
J = odenumjac(@fun,{0 x0}, f0, joptions);
Deepa Maheshvare
el 18 de Feb. de 2021
Walter Roberson
el 18 de Feb. de 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
el 18 de Feb. de 2021
Is that function "odenumjac" MATLAB inbuilt ?
Deepa Maheshvare
el 18 de Feb. de 2021
Deepa Maheshvare
el 18 de Feb. de 2021
Editada: Deepa Maheshvare
el 18 de Feb. de 2021
Walter Roberson
el 18 de Feb. de 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
el 18 de Feb. de 2021
KALYAN ACHARJYA
el 19 de Feb. de 2021
Editada: KALYAN ACHARJYA
el 19 de Feb. de 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
el 19 de Feb. de 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.
Categorías
Más información sobre Programming en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!