Error in naming function handles

Hi all,
I am writting a Runge Kutta for a time varying system of ODEs, but bumped into an error of indexing. I think the problem comes from how I type the function handle but i have no idea how to fix it.
Any clue?
Thanks!
here is the error:
Error using sym/subsasgn (line 961)
Invalid indexing or function definition. Indexing must follow MATLAB indexing. Function arguments must be
symbolic variables, and function body must be sym expression.
and here is my code:
%define function handles
fx1= @(t, x1, x2) ((-t)/(1+t^2))*x1 + x2
fx2 = @(t, x1, x2) (((-4)*t)/(1+t^2))*x2
%deine initial condition
t(1) = 0
x1(1) = 0;
x2(1) = 1;
%define step size
h = 0.1
tfinal= 5
N= ceil(tfinal/h)
%make a loop
for i = 1:N
t(i+1)= t(i)+h; %time update
k1x1= fx1(t(i), x1(i), x2(i));
k1x2= fx2(t(i), x1(i), x2(i));
k2x1= fx1(t(i)+h/2, x1(i)+h/2*k1x1, x2(i)+h/2*k1x2);
k2x2= fx2(t(i)+h/2, x1(i)+h/2*k1x1, x2(i)+h/2*k1x2);
k3x1= fx1(t(i)+h/2, x1(i)+h/2*k2x1, x2(i)+h/2*k2x2);
k3x2= fx2(t(i)+h/2, x1(i)+h/2*k2x1, x2(i)+h/2*k2x2);
k4x1= fx1(t(i)+h, x1(i)+h*k3x1, x2(i)*k3x2);
k4x2= fx2(t(i)+h, x1(i)+h*k3x1, x2(i)*k3x2);
%updating the function
x1(i+1) = x1(i) + (h/6)* (k1x1 + 2*k2x1 + 2*k3x1 + k4x1);
x2(i+1) = x2(i) + (h/6)* (k1x2 + 2*k2x2 + 2*k3x2 + k4x2);
end
%plotting the solution
plot(t,x1)
hold on
plot(t,x2)
xlabel('time')
ylabel('values')
legend('x1','x2')

답변 (1개)

David Hill
David Hill 2020년 3월 8일

0 개 추천

Code works just fine as stand alone. Did you previously use/assign any of your variables (t,x1,x2) as symbolic? I could not find anything wrong with your code and I pasted into matlab and ran it without error.
k2x1= fx1(t(i)+h/2, x1(i)+h/2*k1x1, x2(i)+h/2*k1x2);%Do you mean h/2/k1x2 or what you have? I would normally write h*k1x2/2 or add () to be less confusing.

댓글 수: 4

Walter Roberson
Walter Roberson 2020년 3월 8일
One of t, x1, or x2 was previously a symbolic function, I can tell.
Xingda Chen
Xingda Chen 2020년 3월 8일
Hi David,
I added syms t, x1,x2 and it ran. Idk why I need it but it worked....
Xingda Chen
Xingda Chen 2020년 3월 8일
#Walter Roberson, Yes, i typed syms x1 x2 before and earsed it.
That code could have problems if t, x1, or x2 were defined before the code ran, including if they were defined as symbolic. You should be using
t = zeros(1, N+1);
x1 = zeros(1, N+1);
x2 = zeros(1, N+1);

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Mathematics에 대해 자세히 알아보기

질문:

2020년 3월 8일

댓글:

2020년 3월 8일

Community Treasure Hunt

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

Start Hunting!

Translated by