matlab中for循环只有一个结果是什么情况,下面是我的程序,可以帮忙看一下吗?

clc;
close all;
%% parameter
R0=0.8; a0=2923; a1=-628; a2=402.1; Cth=1.324e-13; Tth=5.953e-6; Tamb=298;
CC=100;
Vm=0.30032043; T=701.5886849;
%求雅可比矩阵
%% Jacobian
for i=1:length(CC)

C=CC(i,1);

A11=(-1./C.*10e9)*(1-Vm.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T));

A12=(-1./C.*10e9).*(Vm.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B11=(2.*Vm-Vm.^2.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(Cth.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B12=((Vm.^2.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T))-Tth)./Cth;

A=[A11 A12;
B11 B12];
[V,D]=eig(A);%求矩阵的特征值特征向量

X=diag(D);

xx(i)=X(1,:);
yy(i)=X(2,:);

XX=xx';
YY=yy';

Re1=real(XX);
Im1=imag(XX);

Re2=real(YY);
Im2=imag(YY);
end

第1个回答  2023-04-25

根据你提供的代码,我看到 xx 和 yy 是在循环内部定义的数组,而 XX 和 YY 是在循环结束后定义的数组,且是通过将 xx 和 yy 转置得到的。因此,在你的代码中,只能得到最后一次循环的结果。如果你想要得到所有循环的结果,需要将 XX 和 YY 改为矩阵形式的变量,并在循环中不断将每次的结果添加到这些矩阵中。


以下是我帮你修改后的代码示例,可以试试:

clc;

close all;

%% parameter

R0=0.8; a0=2923; a1=-628; a2=402.1; Cth=1.324e-13; Tth=5.953e-6; Tamb=298;

CC=100;

Vm=0.30032043; T=701.5886849;

%% Jacobian

num_loop = length(CC);

A_matrix = zeros(num_loop, 2, 2); % 定义矩阵形式的变量来存储 A 矩阵

eig_values = zeros(num_loop, 2);

for i = 1:num_loop

C = CC(i,1);

A11 = (-1./C.*10e9)*(1-Vm.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T));

A12 = (-1./C.*10e9).*(Vm.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B11 = (2.*Vm-Vm.^2.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(Cth.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B12 = ((Vm.^2.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T))-Tth)./Cth;

A = [A11 A12; B11 B12];

A_matrix(i,:,:) = A; % 将每次计算得到的 A 存储到矩阵中

[V, D] = eig(A);

eig_values(i,:) = diag(D);

end

Re1 = real(eig_values(:,1));

Im1 = imag(eig_values(:,1));

Re2 = real(eig_values(:,2));

Im2 = imag(eig_values(:,2));

% 绘制结果的代码

figure;

subplot(2,2,1); scatter(Re1, Im1, 10, 'filled'); xlabel('Real'); ylabel('Imaginary'); title('Eigenvalue 1');

subplot(2,2,2); scatter(Re2, Im2, 10, 'filled'); xlabel('Real'); ylabel('Imaginary'); title('Eigenvalue 2');

subplot(2,2,3); scatter(Re1, Re2, 10, 'filled'); xlabel('Eigenvalue

第2个回答  2023-04-25
在这段代码中,for循环只有一个结果,因为循环只执行一次。这是因为CC变量被设置为一个单一的数值100,而不是一个向量。所以length(CC)返回值为1。
如果你想让循环执行多次,你需要将CC定义为一个向量,例如:
CC = linspace(100, 200, 10); % 从100到200,总共10个值的等差数列
同时,注意到代码中有一些变量使用了错误的大小写,例如T在此处并没有定义。如果你是想用T代替Vm,请相应地替换。这是修改后的代码:
clc;
close all;
%% parameter
R0=0.8; a0=2923; a1=-628; a2=402.1; Cth=1.324e-13; Tth=5.953e-6; Tamb=298;
CC=linspace(100, 200, 10);
Vm=0.30032043; T=701.5886849;
%求雅可比矩阵
%% Jacobian
for i=1:length(CC)
C=CC(i);
A11=(-1./C.*10e9)*(1-Vm.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T));
A12=(-1./C.*10e9).*(Vm.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));
B11=(2.*Vm-Vm.^2.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(Cth.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));
B12=((Vm.^2.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T))-Tth)./Cth;
A=[A11 A12;
B11 B12];
[V,D]=eig(A);%求矩阵的特征值特征向量
X=diag(D);
xx(i)=X(1,:);
yy(i)=X(2,:);
end
XX=xx';
YY=yy';
Re1=real(XX);
Im1=imag(XX);
Re2=real(YY);
Im2=imag(YY);
现在,for循环将执行10次,从而得到10个结果。
…………
回复:
根据你的描述,我们需要修改程序以在每次循环时计算雅可比矩阵的特征值,并将实部和虚部分别存储在数组中。最后,我们可以使用plot函数绘制结果。这是修改后的代码:
clc;
close all;
%% parameter
R0=0.8; a0=2923; a1=-628; a2=402.1; Cth=1.324e-13; Tth=5.953e-6; Tamb=298;
CC=linspace(100, 200, 10);
Vm=0.30032043; T=701.5886849;

% Initialize arrays to store real and imaginary parts of eigenvalues
Re1 = zeros(length(CC), 2);
Im1 = zeros(length(CC), 2);

%求雅可比矩阵
%% Jacobian
for i=1:length(CC)

C=CC(i);

A11=(-1./C.*10e9)*(1-Vm.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T));

A12=(-1./C.*10e9).*(Vm.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B11=(2.*Vm-Vm.^2.*(a1./(2.*T.*Vm.^0.5)+a2./T))./(Cth.*(R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T)));

B12=((Vm.^2.*(a0+a1.*Vm.^0.5+a2.*Vm))./(T.^2.*R0.*exp((a0+a1.*Vm.^0.5+a2.*Vm)./T))-Tth)./Cth;

A=[A11 A12;
B11 B12];
[V,D]=eig(A); %求矩阵的特征值特征向量

X=diag(D);

% Store real and imaginary parts of eigenvalues
Re1(i, :) = real(X);
Im1(i, :) = imag(X);

end

% Plot the real part vs. the imaginary part
figure;
plot(Re1(:, 1), Im1(:, 1), 'o-', 'DisplayName', 'Eigenvalue 1');
hold on;
plot(Re1(:, 2), Im1(:, 2), 'x-', 'DisplayName', 'Eigenvalue 2');
xlabel('Real Part');
ylabel('Imaginary Part');
title('Real vs Imaginary Parts of Eigenvalues');
legend('show');

这段代码计算了雅可比矩阵的特征值并将它们的实部和虚部分别存储在Re1和Im1数组中。然后使用plot函数绘制实部和虚部的关系。追问

感谢回答!还有一点问题,关于for循环这个问题已成功解决!

这个程序我的想法是CC变化求解雅可比矩阵特征值,λ1、λ2,然后再得到它们对应的虚部、实部数据,最后绘制出横坐标为特征值实部,纵坐标为特征值虚部得,随着CC得值变化得曲线,类似下图。

但是特征值得应用部分好像不正确,可以麻烦你帮我改改吗

追答

见正文回复

追问

你好,非常感谢前面的回答!再问一下,我更换了方程组和参数,现在的问题是[V,D]=eig(A)这个矩阵不是方阵,但是不知道怎么改,A很显然就是方阵呀,

本回答被提问者采纳

matlab中for循环只有一个结果是什么情况,下面是我的程序,可以帮忙看一...
Im1 = imag(eig_values(:,1));Re2 = real(eig_values(:,2));Im2 = imag(eig_values(:,2));绘制结果的代码 figure;subplot(2,2,1); scatter(Re1, Im1, 10, 'filled'); xlabel('Real'); ylabel('Imaginary'); title('Eigenvalue 1');subplot(2,2,2); scatter(Re2, Im2, ...

matlab是循环数据但是答案只有一个?
matlab,for循环结果只有一个n0=(4*beta*ap^2\/m\/V)^0.5; 这个语句更新n0变量,并没有对上一次生成的n0进行保存。所以建议程序做一点小小的改动。在for循环之前,初始化一个变量N=[];同时for循环中增加一条语句:

matlab,for循环结果只有一个
matlab,for循环结果只有一个 n0=(4*beta*ap^2\/m\/V)^0.5; 这个语句更新n0变量,并没有对上一次生成的n0进行保存。所以建议程序做一点小小的改动。在for循环之前,初始化一个变量N=[];同时for循环中增加一条语句:

matlab 为啥这个程序画图只显示最后一个
是因为你只画了最后一个 循环结束后,i=40,改一下:clear all;clc;x=[18;20;18;17;17;12;16;16;17;12;15;13;15;14;15;12;14;13;15;17;16;16;15;15;12;13;18;17;13;17;12;16;17;20;16;15;17;20;22;13]y=[16;18;18;15;14;10;16;18;20;15;16;13;17;14;18;13...

matlab for循环为什么只执行1次
其实你的程序已经满足你的要求了,事实上,运行后workspace空间上反映的是最后一个x3,也就是x3循环到最后一个数值(100)后的x3值,当然他就是100了,如果你想要得到的是中间运算中的所有值,而非最终结果,那么请看下面的程序:a1 = 8.001;z3 = 10;k=0;x3 = -100:100 ;for x31=x3(1):...

matlab中for循环为什么只运行了一次
把第二行的k=size(h0);换成k=length(h0);因为size返回数组[1,120],在后面的for里变成了for i=1:1.

用MATLAB编写布林通道,进行循环计算,计算输出结果怎么只有一个数值
n = 55jpm = 10*rand(1,n);M = 19for i = M:length(jpm)avg(1,i) = mean(jpm(1,1+i-M:i),2);stdb(1,i) = std(jpm(1,1+i-M:i),0,2);endBOLL = avg;UB = BOLL+2*stdb;LB = BOLL-2*stdb;tt = M:length(jpm);figureplot(tt,[jpm(tt);BOLL(tt);UB(tt);...

matlab: 为什么我的程序中for循环只执行了一次? 谢谢
work_3(nmat); %多行两列的矩阵 A_1 = A(:,1);A_2 = A(:,2);s1 = numel(unique(A_2)); % length(unique(A_2));count = hist(A_2,unique(A_2));p = 1; k = 1; q = count(1);D = work_5(A_1,p,q);for j = 1:(s1-1)if (length(D) >= 3)output =...

matlab中for循环
用两个变量呗,例如下面的x,用x0保存不变的那个值。x0=100; % 假设的一个值 for i=1:10 x=x0; % 每次循环x都恢复成x0 disp(x)x=x+i; % 改变x的值 disp(x)end

matlab for循环。分析该for循环执行情况,并写出程序运行结果
H = zeros(4,4);for m = 1:4 for n =1:4 H(m,n) = m^2+n^2;end end H 输出结果:H = 2 5 10 17 5 8 13 20 10 13 18 25 17 20 25 32

相似回答
大家正在搜