clear clc syms t u(t) v(t) z R1 = 1.2e-3; R2 = 9.2e-3; Cin = 1.1e6/60; Cwall = 1.86e8/60; PN = 8000; qin = 20; qout = 0; u1 = diff(u); v1 = diff(v); eq1 = Cin*u1 == PN - (u - v)/R1; eq0 = Cin*u1 == 0 - (u - v)/R1; eq2 = Cwall*v1 == (u - v)/R1 - (v - qout)/R2; eq3 = u(0) == 20; eq4 = v(0) == z; [uSol1(t), vSol1(t)] = dsolve(eq1, eq2, eq3, eq4); [uSol2(t), vSol2(t)] = dsolve(eq0, eq2, eq3, eq4); uSol1_func = matlabFunction(uSol1); vSol1_func = matlabFunction(vSol1); uSol2_func = matlabFunction(uSol2); vSol2_func = matlabFunction(vSol2); figure(1) subplot(1, 2, 1), fplot3(uSol1_func, [0 1440], [0 30]); title('开启时室内温度'); xlabel('时间'), ylabel('z轴'), zlabel('温度') subplot(1, 2, 2), fplot3(vSol1_func, [0 1440], [0 30]); title('开启时墙体温度'); xlabel('时间'), ylabel('z轴'), zlabel('温度') figure(2) subplot(1, 2, 1), fplot3(uSol2_func, [0 1440], [0 30]); title('关闭时室内温度'); xlabel('时间'), ylabel('z轴'), zlabel('温度') subplot(1, 2, 2), fplot3(vSol2_func, [0 1440], [0 30]); title('关闭时墙体温度'); xlabel('时间'), ylabel('z轴'), zlabel('温度')错误使用 fplot3 输入 应为以下类型之一: function_handle, sym 但其类型为 double。 出错 first (第 27 行) subplot(1, 2, 1), fplot3(uSol1_func, [0 1440], [0 30]);
时间: 2024-01-26 22:01:46 浏览: 88
根据您提供的代码和错误信息,我猜测问题出在第 27 行,即第一个 fplot3 函数调用上。
您之前所做的修改已经解决了上一个问题,但是这个错误提示似乎表明 fplot3 函数的输入参数类型错误。可能是因为 uSol1_func 函数句柄中的符号表达式包含了 t 变量,但是在 fplot3 函数中没有给出 t 的范围,导致 fplot3 函数无法将函数句柄转换成函数值。
为了解决这个问题,您可以在调用 fplot3 函数时,将 t 变量的范围一并指定,例如:
```matlab
subplot(1, 2, 1), fplot3(@(t,z) uSol1_func(t,z), [0 1440], [0 30]);
```
这样,fplot3 函数就可以正确地将函数句柄 uSol1_func 转换成函数值,并绘制出图像。同样地,对于另外三个 fplot3 函数的调用也需要进行相应的修改。
相关问题
clear clc syms t u(t) v(t) z=0; R1 = 1.2e-2; R2 = 9.2e-3; Cin = 1.1e6/60; Cwall = 1.86e8/60; PN = 8000; qin = 20; qout = -15; u1 = diff(u); v1 = diff(v); eq0 = Cin*u1 == - (u - v)/R1; eq1 = Cin*u1 == PN - (u - v)/R1; eq2 = Cwall*v1 == (u - v)/R1 - (v - qout)/R2; eq3 = u(0) == qin; eq4 = v(0) == z; [uSol1(t), vSol1(t)] = dsolve(eq1, eq2, eq3, eq4); [uSol2(t), vSol2(t)] = dsolve(eq0, eq2, eq3, eq4); figure(1) subplot(2,2,1),fplot(t,uSol1,[0 60]) xlabel('时间/min'),ylabel('开启时室内温度') subplot(2,2,2),fplot(t,vSol1,[0 60]) xlabel('时间/min'),ylabel('开启时室内温度') subplot(2,2,3),fplot(t,uSol2,[0 60]) xlabel('时间/min'),ylabel('开启时室内温度') subplot(2,2,4),fplot(t,vSol2,[0 60]) xlabel('时间/min'),ylabel('开启时室内温度')
好的,将该代码改为使用ode45求解,可以按照以下步骤进行:
1. 定义一个函数,包含系统的ODE方程,例如:
```
function dydt = myODEfun(t, y)
% 定义参数和变量
R1 = 1.2e-2;
R2 = 9.2e-3;
Cin = 1.1e6/60;
Cwall = 1.86e8/60;
PN = 8000;
qin = 20;
qout = -15;
u = y(1);
v = y(2);
% 定义ODE方程
du_dt = y(3);
dv_dt = y(4);
dudt = Cin*du_dt + (u - v)/R1;
dvdt = Cwall*dv_dt - (u - v)/R1 + (v - qout)/R2 - PN;
% 返回ODE方程的结果
dydt = [du_dt; dv_dt; dudt; dvdt];
end
```
2. 定义初始条件和时间范围:
```
tspan = [0, 60];
y0 = [qin; z; 0; 0];
```
3. 调用ode45函数求解ODE方程:
```
[t, y] = ode45(@myODEfun, tspan, y0);
```
4. 绘制结果:
```
figure
subplot(2,2,1), plot(t, y(:,1)), xlabel('时间/min'),ylabel('开启时室内温度')
subplot(2,2,2), plot(t, y(:,2)), xlabel('时间/min'),ylabel('开启时室内温度')
subplot(2,2,3), plot(t, y(:,3)), xlabel('时间/min'),ylabel('开启时室内温度')
subplot(2,2,4), plot(t, y(:,4)), xlabel('时间/min'),ylabel('开启时室内温度')
```
这样就可以使用ode45求解该系统的ODE方程了。
代码如下:clear clc syms t u(t) v(t) z R1 = 1.2e-2; R2 = 9.2e-3; Cin = 1.1e6/60; Cwall = 1.86e8/60; PN = 8000; qin = 20; qout = -20; u1 = diff(u); v1 = diff(v); eq0 = Cin*u1 == - (u - v)/R1; eq1 = Cin*u1 == PN - (u - v)/R1; eq2 = Cwall*v1 == (u - v)/R1 - (v - qout)/R2; eq3 = u(0) == z; eq4 = v(0) == z-5; [uSol1(t), vSol1(t)] = dsolve(eq1, eq2, eq3, eq4); [uSol2(t), vSol2(t)] = dsolve(eq0, eq2, eq3, eq4); figure(1) subplot(2,2,1),fsurf(t,z,uSol1,[0 1440 -25 20]) xlabel('时间/min'),ylabel('初始室内温度'),zlabel('开启时室内温度') subplot(2,2,2),fsurf(t,z,vSol1,[0 1440 -25 20]) xlabel('时间/min'),ylabel('初始室内温度'),zlabel('开启时墙体温度') subplot(2,2,3),fsurf(t,z,uSol2,[0 1440 -25 20]) xlabel('时间/min'),ylabel('初始室内温度'),zlabel('关闭时室内温度') subplot(2,2,4),fsurf(t,z,vSol2,[0 1440 -25 20]) xlabel('时间/min'),ylabel('初始室内温度'),zlabel('关闭时墙体温度')
这段代码是用 MATLAB 求解一个室内温度控制的微分方程组,并绘制了四个图形。其中,dsolve 函数用于解析解微分方程。你想用 ode45 函数来代替 dsolve 函数,下面是一个示例代码,演示如何将其转换为数值解:
```
clear
clc
% 定义常数
R1 = 1.2e-2;
R2 = 9.2e-3;
Cin = 1.1e6/60;
Cwall = 1.86e8/60;
PN = 8000;
qin = 20;
qout = -20;
% 定义微分方程
odefun = @(t,y) [Cin*(y(2) - y(1))/R1; (y(1) - y(2))/R1 - (y(2) - qout)/R2];
% 定义初始条件
y0 = [z; z-5];
% 定义求解区间
tspan = [0 1440];
% 调用 ode45 函数进行求解
[t,y] = ode45(odefun, tspan, y0);
% 绘制解的图像
uSol1 = y(:,1);
vSol1 = y(:,2);
uSol2 = y(:,1);
vSol2 = y(:,2);
figure(1)
subplot(2,2,1),fsurf(t,z,uSol1,[0 1440 -25 20])
xlabel('时间/min'),ylabel('初始室内温度'),zlabel('开启时室内温度')
subplot(2,2,2),fsurf(t,z,vSol1,[0 1440 -25 20])
xlabel('时间/min'),ylabel('初始室内温度'),zlabel('开启时墙体温度')
subplot(2,2,3),fsurf(t,z,uSol2,[0 1440 -25 20])
xlabel('时间/min'),ylabel('初始室内温度'),zlabel('关闭时室内温度')
subplot(2,2,4),fsurf(t,z,vSol2,[0 1440 -25 20])
xlabel('时间/min'),ylabel('初始室内温度'),zlabel('关闭时墙体温度')
```
在上述代码中,我们首先将微分方程转化为 MATLAB 函数 `odefun`,并将其传递给 ode45 函数进行数值求解。然后,我们定义了初始条件 `y0` 和求解区间 `tspan`,并调用 ode45 函数进行求解。最后,我们绘制了解的图像。需要注意的是,由于 ode45 函数返回的是一个二维数组,因此我们需要将其拆分为两个一维数组,分别表示室内温度和墙体温度的解。
阅读全文
相关推荐
















