KP = 1; KI = [0.1, 0.2, 0.3, 0.4]; f = 85e3; s = logspace(-5, -4, 1000); H = zeros(length(s), length(KI)); for i = 1:length(KI) ki = KI(i); H(:,i) = (2.*KP.*f.*s+2.*KI.*f.^2)./(s.^2+2.*KP.*f.*s+2.*KI.*f.^2); end figure; plot(s, H(:,1), 'LineWidth', 2); hold on; plot(s, H(:,2), 'LineWidth', 2); plot(s, H(:,3), 'LineWidth', 2); plot(s, H(:,4), 'LineWidth', 2); legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4'); xlabel('s'); ylabel('H');数组大小不兼容,s是时间变化量
时间: 2024-02-19 08:59:20 浏览: 33
如果s表示时间变化量,那么在计算传递函数时,s应该是一个复数变量,用来表示系统在复频域中的响应。此时,logspace函数生成的向量不再适用,需要使用linspace函数生成一个实数向量。
修正后的代码如下:
```matlab
KP = 1;
KI = [0.1, 0.2, 0.3, 0.4];
f = 85e3;
t = linspace(0, 1, 1000); % 生成一个时间向量,表示从0秒到1秒的时间变化量
H = zeros(length(t), length(KI));
for i = 1:length(KI)
ki = KI(i);
H(:,i) = (2.*KP.*f+2.*KI.*f.^2.*t)./(t.^2+2.*KP.*f.*t+2.*KI.*f.^2);
end
figure;
plot(t, H(:,1), 'LineWidth', 2);
hold on;
plot(t, H(:,2), 'LineWidth', 2);
plot(t, H(:,3), 'LineWidth', 2);
plot(t, H(:,4), 'LineWidth', 2);
legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4');
xlabel('Time (s)');
ylabel('H');
```
这样,就可以正确地计算系统的传递函数,并绘制出随时间变化的曲线。需要注意的是,此时传递函数的值不再是复数,而是一个实数。
相关问题
KP = 1; KI = [0.1, 0.2, 0.3, 0.4]; f = 85e3; s = logspace(-5, -4, 1000); H = zeros(length(s), length(KI)); for i = 1:length(KI) ki = KI(i); H(:,i) = (2.*KP.*f.*s+2.*KI.*f.^2)./(s.^2+2.*KP.*f.*s+2.*KI.*f.^2); end figure; plot(s, H(:,1), 'LineWidth', 2); hold on; plot(s, H(:,2), 'LineWidth', 2); plot(s, H(:,3), 'LineWidth', 2); plot(s, H(:,4), 'LineWidth', 2); legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4'); xlabel('s'); ylabel('H');数组大小不兼容
这段代码的问题在于,如果在执行该代码之前没有定义KP、KI、f和s这些变量,那么代码无法正确运行。因此,在使用该代码之前,需要确保这些变量已经被正确定义。
另外,该代码使用了logspace函数生成一个频率向量s,但是logspace函数的输入参数不是频率,而是频率的对数。因此,如果需要生成一个频率范围在1Hz到10kHz之间的向量,应该使用如下代码:
```matlab
s = logspace(0, 4, 1000)*2*pi;
```
这样生成的s向量的单位是弧度/秒,因此在计算传递函数时需要注意。
修正后的代码如下:
```matlab
KP = 1;
KI = [0.1, 0.2, 0.3, 0.4];
f = 85e3;
s = logspace(0, 4, 1000)*2*pi; % 将logspace的输出乘以2*pi,得到频率向量
H = zeros(length(s), length(KI));
for i = 1:length(KI)
ki = KI(i);
H(:,i) = (2.*KP.*f.*s+2.*KI.*f.^2)./(s.^2+2.*KP.*f.*s+2.*KI.*f.^2);
end
figure;
plot(s/(2*pi), abs(H(:,1)), 'LineWidth', 2);
hold on;
plot(s/(2*pi), abs(H(:,2)), 'LineWidth', 2);
plot(s/(2*pi), abs(H(:,3)), 'LineWidth', 2);
plot(s/(2*pi), abs(H(:,4)), 'LineWidth', 2);
legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4');
xlabel('Frequency (Hz)');
ylabel('Magnitude');
```
这样,就可以正确地绘制出系统的传递函数随频率变化的曲线了。
KP = 1; KI = [0.1, 0.2, 0.3, 0.4]; f = 85e3; t = linspace(0, 1, 1000); % 生成一个时间向量,表示从0秒到1秒的时间变化量 H = zeros(length(t), length(KI)); for i = 1:length(KI) ki = KI(i); H(:,i) = (2.*KP.*f+2.*KI.*f.^2.*t)./(t.^2+2.*KP.*f.*t+2.*KI.*f.^2); end figure; plot(t, H(:,1), 'LineWidth', 2); hold on; plot(t, H(:,2), 'LineWidth', 2); plot(t, H(:,3), 'LineWidth', 2); plot(t, H(:,4), 'LineWidth', 2); legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4'); xlabel('Time (s)'); ylabel('H');数组大小不兼容,如何修改
为了解决这个问题,可以将 H 的第二个维度大小设置为 4,例如可以在代码中添加一行:
```
H = zeros(length(t), 4);
```
然后再将 H(:,i) 赋值即可。修改后的代码如下:
```
KP = 1;
KI = [0.1, 0.2, 0.3, 0.4];
f = 85e3;
t = linspace(0, 1, 1000); % 生成一个时间向量,表示从0秒到1秒的时间变化量
H = zeros(length(t), 4); % 修改 H 的第二个维度大小为 4
for i = 1:length(KI)
ki = KI(i);
H(:,i) = (2.*KP.*f+2.*KI.*f.^2.*t)./(t.^2+2.*KP.*f.*t+2.*KI.*f.^2);
end
figure;
plot(t, H(:,1), 'LineWidth', 2);
hold on;
plot(t, H(:,2), 'LineWidth', 2);
plot(t, H(:,3), 'LineWidth', 2);
plot(t, H(:,4), 'LineWidth', 2);
legend('KI=0.1', 'KI=0.2', 'KI=0.3', 'KI=0.4');
xlabel('Time (s)');
ylabel('H');
```
这样就可以顺利运行了。