在matlab中将符号变量分配给数值变量

时间:2015-11-13 09:45:09

标签: matlab ode differential-equations

我有符号变量:

[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)

当我运行代码时,它会出错并说出

  

使用odearguments时出错(第110行)输入必须是浮点数,即   单身或双人。

     

ode45错误(第115行)       odearguments(FcnHandlesUsed,solver_name,ode,       tspan,y0,options,varargin);

     

mainfunc中的错误(第140行)[tout,xout] = ode45(function_q,tspan,x0)   尝试打开('使用odearguments时出错(第110行)             ↑错误:字符串未正确终止。

我认为问题是由于将符号变量放到ode45函数中。我怎么解决这个问题?如何以数字形式定义n矩阵

1 个答案:

答案 0 :(得分:1)

问题是来自ode_system的返回值的类型。由于n_t是符号,dydt是符号,ode45不喜欢。在ode_system内,尝试使用subsn_t中的变量替换为相应的值。然后使用double将符号数转换为“常规”数字。如果你建立一个更大的系统,这将是缓慢的,但它现在应该没问题。

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