- The expression represents an index into the given variable. Valid indices must be datatype logical, or (obscurely) must be a character or character vector (obscure!), or must be numeric values that are positive integers. Your t is a non-integer double precision scalar, and so is not a valid index; OR
- The expression is a symbolic variable name or (obscurely) a vector of symbolic variable names. In this case, the name does not indicate indexing, and instead indicates that a symbolic function is to be created in which that name is the name of the formal parameter; for example syms x; f(x) = x^2 - 2; In this case, the resulting symbolic function defines a formula rather than indexing
My code will not run after adding in the code after function dydt=myFunc(t,y)
1 view (last 30 days)
Show older comments
%clear,clc
%why is call_myFunc not read
Q_A=0;
P_1=0;
Q_B=0;
P_2=0;
[y(1),y(2),y(3),y(4)]=deal(Q_A,P_1,Q_B,P_2);
[T,Y]=call_myFunc;
function [T,Y]=call_myFunc()
tspan=[0 8*pi];
ICs=[0,0,0,0];
[T,Y]=ode45(@myFunc,tspan,ICs);
figure(1)
plot(T,Y(:,1),'b',T,Y(:,2),'k', T,Y(:,3),'g', T,Y(:,4),'m')
legend('Q_A','P_1','Q_B','P_2')
xlabel('time[s]')
end
function dydt=myFunc(t,y)
dydt=zeros(4,1);
Ra=1;
Rb=1;
La=0.1;
Lb=0.1;
C1=1;
C2=1;
A=30; %mmHg
B=90; %mmHg
w=2*pi; %rad/s
deltaP(t)=A*sin(w*t)+B;
dydt=[-(Ra/La)*y(1)-(1/La)*y(2)+0*y(3)+(1/La)*y(4);(1/C1)*y(1)+0*y(2)-(1/C1)*y(3)+0*y(4);0*y(1)+(1/Lb)*y(2)-(Rb/Lb)*y(3)-(1/Lb)*y(4);-(1/C2)*y(1)+0*y(2)+(1/C2)+0*y(4)]
end
0 Comments
Answers (1)
Walter Roberson
on 12 Oct 2021
function dydt=myFunc(t,y)
t will be a double precision number representing the current "time". t will seldom be an integer during execution
deltaP(t)=A*sin(w*t)+B;
In MATLAB, Variable(expression) on the left hand side of an assignment statement has two possible meanings:
You appear to have tried to use formula definition syntax with a double precision number instead of a symbolic variable.
In this case, the repair is to remove the line. You do not use deltaP in your calculation, so there is no point assigning to it.
The more general solutions would be one of:
deltaP=A*sin(w*t)+B;
and then use deltaP as a variable name; OR
deltaP = @(t) A*sin(w*t)+B;
and then when you use deltaP be sure to pass a parameter to it.
I would suggest that using a plain variable is more likely to be useful for your situation.
Note: you also do not use a number of other variables in your function, such as A B w.
0 Comments
See Also
Categories
Find more on Calculus in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!