在matlab中将符号变量分配给数字变量
Assigning symbolic variables to numeric variables in matlab
我有符号变量是:
[q dq ddq n]
q=[q1; q2];
dq=[dq1; dq2];
ddq=[ddq1; ddq2];
变量n
是
n=[2*dq1 + (83*dq1*dq2)/400;
(83*dq1^2)/800 + 2*dq2]
我正在尝试使用以下变量获取 ODE 函数的值:
state=[q; dq];
u=[5;5];
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
ddxdt=inv(B)*(u-n); %which is 2x1 matrix
%B is a 2x2 numeric matrix
dstate=[dxdt1; dxdt2; ddxdt];
使用这个变量我尝试获得方程的解
t0=0;
tf=1;
N=10;
tspan=linspace(t0,tf,N);
x0=[0.5; 0.5;zeros(2,1)];
function_q=@(tspan,state)ode_system(tspan,state,B,n,u);
odesystem 在哪里
function dydt=ode_system(time, state,B,n_t,u)
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
ddxdt=inv(B)*(u-n_t);
dydt=[dxdt1; dxdt2; ddxdt]
end
最后我试着计算
[tout,xout]=ode45(function_q, tspan, x0)
当我 运行 代码时它给出一个错误并说
Error using odearguments (line 110) Inputs must be floats, namely
single or double.
Error in ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode,
tspan, y0, options, varargin);
Error in mainfunc (line 140) [tout,xout]=ode45(function_q, tspan, x0)
try open('Error using odearguments (line 110)
↑ Error: String is not terminated properly.
我认为问题是由于将符号变量放入 ode45 函数引起的。我怎么解决这个问题?如何以数字形式定义 n 矩阵
问题是来自 ode_system
的 return 值的类型。因为 n_t
是象征性的,所以 dydt
是象征性的,而 ode45
不喜欢那样。在 ode_system
中,尝试使用 subs
将 n_t
中的变量替换为相应的值。然后使用 double
将符号数转换为 "regular" 数。如果你做一个更大的系统,这会很慢,但现在应该没问题。
function dydt=ode_system(time, state,B,n_t,u)
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
free_vars = sym({'dq1','dq2'});
free_values = [dq1,dq2];
n_t = subs(n_t, free_vars, free_values);
n_t = double(n_t);
ddxdt=inv(B)*(u-n_t);
dydt=[dxdt1; dxdt2; ddxdt]
end
我有符号变量是:
[q dq ddq n]
q=[q1; q2];
dq=[dq1; dq2];
ddq=[ddq1; ddq2];
变量n
是
n=[2*dq1 + (83*dq1*dq2)/400;
(83*dq1^2)/800 + 2*dq2]
我正在尝试使用以下变量获取 ODE 函数的值:
state=[q; dq];
u=[5;5];
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
ddxdt=inv(B)*(u-n); %which is 2x1 matrix
%B is a 2x2 numeric matrix
dstate=[dxdt1; dxdt2; ddxdt];
使用这个变量我尝试获得方程的解
t0=0;
tf=1;
N=10;
tspan=linspace(t0,tf,N);
x0=[0.5; 0.5;zeros(2,1)];
function_q=@(tspan,state)ode_system(tspan,state,B,n,u);
odesystem 在哪里
function dydt=ode_system(time, state,B,n_t,u)
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
ddxdt=inv(B)*(u-n_t);
dydt=[dxdt1; dxdt2; ddxdt]
end
最后我试着计算
[tout,xout]=ode45(function_q, tspan, x0)
当我 运行 代码时它给出一个错误并说
Error using odearguments (line 110) Inputs must be floats, namely single or double.
Error in ode45 (line 115) odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
Error in mainfunc (line 140) [tout,xout]=ode45(function_q, tspan, x0) try open('Error using odearguments (line 110) ↑ Error: String is not terminated properly.
我认为问题是由于将符号变量放入 ode45 函数引起的。我怎么解决这个问题?如何以数字形式定义 n 矩阵
问题是来自 ode_system
的 return 值的类型。因为 n_t
是象征性的,所以 dydt
是象征性的,而 ode45
不喜欢那样。在 ode_system
中,尝试使用 subs
将 n_t
中的变量替换为相应的值。然后使用 double
将符号数转换为 "regular" 数。如果你做一个更大的系统,这会很慢,但现在应该没问题。
function dydt=ode_system(time, state,B,n_t,u)
q1=state(1);
q2=state(2);
dq1=state(3);
dq2=state(4);
dxdt1=dq1;
dxdt2=dq2;
free_vars = sym({'dq1','dq2'});
free_values = [dq1,dq2];
n_t = subs(n_t, free_vars, free_values);
n_t = double(n_t);
ddxdt=inv(B)*(u-n_t);
dydt=[dxdt1; dxdt2; ddxdt]
end