Symbolic function doesn't work

syms L alpha gamma Y2 Y3 Y4 Y5 Y6 x X dL T(L,x)
syms T(L,x)
M1 = 0;
M2 = 7;
Y1 = 1 + M2 / 10;
Y7 = 3 + M1 / 10;
xcp = [0 0.1*L 0.25*L 0.5*L 0.6*L 0.75*L L];
ycp = [Y1 Y2 Y3 Y4 Y5 Y6 Y7];
T0 = 5 + 1/L - 25/(L^2);
S = bezier_syms();
ode = diff(T,x) == (1+alpha*M1)*(T^2)*S(L,x,Y2,Y3,Y4,Y5,Y6) - 4*(2 + gamma*M2)*x*T;
derivL = diff(ode,L);
U = diff(T,L);
eqns = [derivL, diff(T,L) == dL];
eqns = matlabFunction(eqns);
sol = ode45(eqns,[0 5],diff(T0,L));
I get the error:
Warning: Function 'T' not verified to be a valid MATLAB function.
For some reason it doesn't let me define the T function. Any ideas?
Edit:
function S = bezier_syms()
syms t x y s X Y2 Y3 Y4 Y5 Y6 L
M1 = 0;
M2 = 7;
Y1 = 1 + M2 / 10;
Y7 = 3 + M1 / 10;
xcp = [0 0.1*L 0.25*L 0.5*L 0.6*L 0.75*L L];
ycp = [Y1 Y2 Y3 Y4 Y5 Y6 Y7];
N = length(xcp) - 1;
% Calculate m matrix
m = zeros(N+1,N+1);
for i=0:N
for j=0:N
if i <= j
m(i+1,j+1) = ((-1)^(j-i)) * nchoosek(N,j) * nchoosek(j,i);
end
end
end
% Calculate C
T = sym(zeros(N+1,1));
for i = 1:length(T)
T(i) = t^(i-1);
end
C = m * T;
x = 0;
y = 0;
for i = 1:N+1
x = x + xcp(i)*C(i);
y = y + ycp(i)*C(i);
end
% Convert syms to functions
getx = matlabFunction(x);
gety = matlabFunction(y);
% Polynomial regression
regt = linspace(0,1,8);
n = length(regt);
xreg = sym(zeros(n,1));
Yreg = sym(zeros(n,1));
for i=1:n
xreg(i) = getx(L,regt(i));
Yreg(i) = gety(Y2,Y3,Y4,Y5,Y6,regt(i));
end
Xreg = sym(zeros(n,n));
Xreg(:,1) = ones(n,1);
for i=1:(n-1)
Xreg(:,i+1) = xreg.^i;
end
coef = inv(Xreg' * Xreg) * Xreg' * Yreg; %#ok<MINV>
s = 0;
for i=1:n
s = s + coef(i)*(X^(i-1));
end
S = matlabFunction(s);
end

댓글 수: 8

I suspect the problem is ‘S’. We can’t run this because we don’t have the function.
Meanwhile:
syms T(L,x)
Eqn = diff(T,L) + diff(T,x)
produces:
Eqn(L, x) =
diff(T(L, x), L) + diff(T(L, x), x)
so ‘T’ itself is not the problem.
John F
John F 2020년 12월 22일
@StarStrider I edited the question to include it
Walter Roberson
Walter Roberson 2020년 12월 22일
use odeFunction not matlabFunction when you are working with ode
The problem is likely that ‘T’ is a multivariate function, so you are attempting to have ode45 solve a partial differential equation. It is not designed to do that.
I usually use odeToVectorField before using matlabFunction for systems of equations. When I tried that here:
eqns1 = [derivL, diff(T,L) == dL];
eqns2 = odeToVectorField(eqns1);
the error was:
Error using odeToVectorField>mupadOdeToVectorField (line 160)
Symbolic ODEs must have exactly one independent variable.
You need to revisit this to understand what you want to do, and what you want the ordinary differential equation solvers to do.
I also suspect that ‘S’ needs to be defined and called in your code with all its arguments, rather that the way you are calling it now.
@WalterRoberson I used something like:
eqns = odeFunction(eqns,[T(L,x),U(L,x)]);
but it doesn't work. I haven't used odeFunction before
eqns = [derivL, diff(T,L) == dL];
You cannot include boundary conditions in the equations. Please read the first example for odeFunction to see the work flow -- but also take into consideration that ode45 cannot be used for partial differential equations
John F
John F 2020년 12월 22일
@StarStrider I had asked another question before this one here. Maybe that helps you understand what I'm trying to achieve
Star Strider
Star Strider 2020년 12월 22일
I posted an Answer to your other Question (that you cited in your Comment) just now.

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

답변 (0개)

카테고리

제품

릴리스

R2018b

질문:

2020년 12월 22일

댓글:

2020년 12월 22일

Community Treasure Hunt

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

Start Hunting!

Translated by