Octave 脚本创建符号函数?

问题描述 投票:0回答:1

我正在尝试使用嵌套 for 循环来计算以下内容。方程的输入要么是实数正双精度数,要么是其中包含实数正双精度数的数组。没有符号输入。在代码的前面,我使用符号变量,但我通过执行“double(x)”将它们转换为双精度,例如。

当方程在这个特定的脚本文件中运行时,它会出错,提示尝试将浮点传递给 syms 是危险的,等等。

当我打开一个新选项卡,并用双精度值对变量进行硬编码,然后运行脚本,然后查看方程的输出时,它运行良好,我能够绘制我需要的内容...

我不明白为什么在我编写的主脚本中,方程将每个结果变成符号答案,并最终创建一个符号矩阵......

我知道这个脚本可以工作,因为它之前就可以工作,所以起源是一个工作脚本。

代码方程式如下所示:

fo_act = 1/(2*pi*sqrt(Lr_chosen*Cr_chosen))

fmin = double(Min_Norm_freq)*fo

fmax = double(Max_Norm_freq)*fo

FN_plot  = [0.1:0.001:fmax/fo*1.5]

QE_plot  = [0; Qe_minimum_load_value; Qe_act; Qe_ovrld_act]

LN_act = 3.5;

topology_Constant = 1;

for i = 1:size(QE_plot,1)
  for q = 1:size(FN_plot,2)
    MG(i,q) = (((LN_act*FN_plot(q)^2))/((((LN_act+1)*(FN_plot(q).^2)-1)+j*(((FN_plot(q)^2)-1).*FN_plot(q).*QE_plot(i)*LN_act))))*1/topology_Constant;
  endfor
endfor

在命令窗口中,当我在 for 循环之前得到每个变量的答案时,它们显示为真正的双精度数。

我添加了一张图像,显示 Fn_plot 是双精度型,所有其他变量都是实双精度型或整数,正如我所说。另外,显示我收到的警告。

Scirpt Image

这种类型的错误将永远存在,除非你按 ctrl + C 来阻止它。

当我执行 ctrl + C,然后打印函数的输出时,我得到以下输出:

MG function Output

为此,我将代码复制并粘贴到新的脚本页面中。但是,在嵌套 for 循环之前的此页面,我对值进行了硬编码,如下所示。因此,上面的内容并不重要,因为正如您所看到的,方程只是使用我手动硬编码的值,而不是上面的内容。

您无法运行它,因为您需要其他文件的其他功能。但这就是代码。


clear all;
clc;
pkg 

   x = input('For Max Gain Max load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('For Max Gain Max load,Enter a value (knowing it will be divided by 100) for QE : ' );

    z = input('For Max Gain Max load,Enter a value (knowing it will be divided by 10) for LN : ' );




%Select QE, MG, LN, for Max_gain -> minimum frequency
MG = sym(x)/100;
QE_maxLoad = sym(y)/100;
LN = sym(z)/10;
Des_rev = 0;
topology_Constant = 1;

Mg_Min = 0.79586;
Mg_max_ov = 1.2706;

Attainable_Peak_Gain_Graph(Mg_max_ov,Mg_Min,LN, Des_rev, topology_Constant)
printf(newline)
x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );
printf(newline)
Min_Norm_freq = Fn_calc(MG, QE_maxLoad, LN, x0)
printf(newline)






#{

    x = input('For Minimum Gain Minimum load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('For Minimum Gain Minimum Load, Enter a value (knowing it will be divided by 100) for QE : ' );

    x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );

MG = sym(x)/100;
QE_min_load = sym(y)/100;
printf(newline)
Max_Norm_freq = Fn_calc(MG, QE_min_load, LN, x0)
#}


printf(newline)
printf(newline)

n_act = 4;
Vout_nom = 42;
Iout = 56;

%Determine Re
Re = ((8 * n_act^2)/pi^2)*(Vout_nom/Iout) % Full load Re
Re_overLoad = Re/1.1 % Over load Re @ 110%

%Determine Resonant Components

MG = double(MG);
QE = double(QE_maxLoad)
LN = double(LN)

%Initial Chosen Resonant Frequency, 90% of Fmax

fo = input('Enter The Resonant Frequency of choice: ' )
printf(newline)

QE_CR = QE;

printf(newline)
printf(newline)
printf('Resonant Capacitance')
printf(newline)

Cr = 1/(2*pi*fo*Re*QE_CR)

Cr_chosen = input('Enter Chosen Value for Cr : ' )

printf(newline)
printf(newline)
printf('Resonant Inductances and Normalized Inductance')
printf(newline)
Lr = 1/(((2*pi*fo)^2)*Cr_chosen)
printf(newline)
Lr_actual = (QE_CR*Re)^2 * Cr_chosen
%Qe_Cr_Chosen = sqrt(Lr/Cr_chosen)/Re
printf(newline)
Lr_chosen = input('Enter Chosen Value for Lr : ' )
Lm_required_for_Chosen_LN = LN*Lr_chosen
LM_chosen = input('Enter Chosen Value for LM : ' )
LN_act = LM_chosen/Lr_chosen


%Verify Design and Produce Gain graph



printf(newline)
printf(newline)

printf(newline)
printf(newline)
printf('Full load and Overload Q factors')
printf(newline)

%Quality Factor at Full load
Qe_act = sqrt(Lr_chosen/Cr_chosen)/Re

%Quality Factor at Overload
Qe_ovrld_act = sqrt(Lr_chosen/Cr_chosen)/Re_overLoad

 printf(newline)
 printf(newline)



% Finding Max Normalized frequency for Minimum Load

% Finding Max Normalized frequency for Minimum Load

    pout = input('Enter the minimum output load in watts : ' );

   % y  = sqrt(Lr_chosen/Cr_chosen)/((8 * n_act^2)/pi^2)*(Vout_nom^2/pout); % QE_min_load
    printf(newline)
    Qe_minimum_load_value = sqrt(Lr_chosen/Cr_chosen)/(((8 * n_act^2)/pi^2)*(Vout_nom^2/pout))
    printf(newline)
    Mg_Min
    x = input('For Minimum Gain Minimum load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('Knowing Qe_minimum_load_value above, Enter the value (knowing it will be divided by 1000) for QE : ' );

    x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );

MG = sym(x)/100;
QE_min_load = sym(y)/1000;
printf(newline)
Max_Norm_freq = Fn_calc(MG, QE_min_load, LN, x0)

printf(newline)
printf(newline)
printf('Design Frequencies')
printf(newline)
fo_act = 1/(2*pi*sqrt(Lr_chosen*Cr_chosen))
%fmin = double(Min_Norm_freq)*fo
fmin = 80000;
fmax = 250000;
%fmax = double(Max_Norm_freq)*fo
%FN_plot = [0.1:0.001:double(Max_Norm_freq)*1.5];
FN_plot  = [0.1:0.001:3];
%QE_plot = [0; double(QE_min_load); Qe_act; Qe_ovrld_act];
QE_plot  = [0; 0.35; 0.549; 0.60449];

for i = 1:size(QE_plot,1)
  for q = 1:size(FN_plot,2)
    MG(i,q) = (((3*FN_plot(q)^2))/((((3+1)*(FN_plot(q).^2)-1)+j*(((FN_plot(q)^2)-1).*FN_plot(q).*QE_plot(i)*3))))*1/1;
  endfor
endfor

%{
QE_plot = {0,"No Load"; Qe_minimum_load_value, "Min Load"; Qe_act, "Full Load"; Qe_ovrld_act, "Overload"};


figure()
%plot(FN_plot,abs(MG), 'MarkerSize', 10, 'LineWidth', 1.25, 'DisplayName', 'No load', 'DisplayName', 'Full Load', 'DisplayName', 'Overload')
plot(FN_plot,abs(MG), 'MarkerSize', 10, 'LineWidth', 1.25)

hold on
%semilogx(F_POS,F_cap_Q,'m','LineWidth', 1);
%semilogx(F_POS,F_cap_Q,'ro','LineWidth', 1,'MarkerSize', 5);
%title(['Design Rev ', num2str(Des_rev), " - MG_a_c_t_u_a_l vs F_n"] , 'fontsize', 25)

xlabel(" F_n (Normalized Frequency)",'fontsize', 24)
ylabel(" MG_a_c_t_u_a_l", 'fontsize', 24)
axis ([0, fmax/fo*1.4 , 0.6*0.79, 1.3*1.5])

然后我编写完全相同的代码,除了删除“fmin”上面的所有代码,并将硬编码值放入另一个新脚本页面中,它运行良好。只是为了表明它是完全相同的,下图..我不明白这有什么意义。

fmin = 80000;
fmax = 250000;
%fmax = double(Max_Norm_freq)*fo
%FN_plot = [0.1:0.001:double(Max_Norm_freq)*1.5];
FN_plot  = [0.1:0.001:3];
%QE_plot = [0; double(QE_min_load); Qe_act; Qe_ovrld_act];
QE_plot  = [0; 0.35; 0.549; 0.60449];

for i = 1:size(QE_plot,1)
  for q = 1:size(FN_plot,2)
    MG(i,q) = (((3*FN_plot(q)^2))/((((3+1)*(FN_plot(q).^2)-1)+j*(((FN_plot(q)^2)-1).*FN_plot(q).*QE_plot(i)*3))))*1/1;
  endfor
endfor
debugging warnings octave
1个回答
0
投票

我昨晚最终找到了答案,我在变量 MG 被分配符号类的地方放置了大量的百分号。该代码以前可以工作,因为我重复使用了同一个变量 (MG) 两次,但是,在进入该主方程之前,我将其设置为双精度。当我移动代码的一些片段时,我忘记在进入该方程之前将其分配为双精度,因此我遇到了问题......


clear all;
clc;
pkg 

   x = input('For Max Gain Max load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('For Max Gain Max load,Enter a value (knowing it will be divided by 100) for QE : ' );

    z = input('For Max Gain Max load,Enter a value (knowing it will be divided by 10) for LN : ' );




%Select QE, MG, LN, for Max_gain -> minimum frequency

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MG = sym(x)/100;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

QE_maxLoad = sym(y)/100;
LN = sym(z)/10;
Des_rev = 0;
topology_Constant = 1;

Mg_Min = 0.79586;
Mg_max_ov = 1.2706;

Attainable_Peak_Gain_Graph(Mg_max_ov,Mg_Min,LN, Des_rev, topology_Constant)
printf(newline)
x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );
printf(newline)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Min_Norm_freq = Fn_calc(MG, QE_maxLoad, LN, x0)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

printf(newline)







#{

    x = input('For Minimum Gain Minimum load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('For Minimum Gain Minimum Load, Enter a value (knowing it will be divided by 100) for QE : ' );

    x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
**MG** = sym(x)/100;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
QE_min_load = sym(y)/100;
printf(newline)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Max_Norm_freq = Fn_calc(**MG**, QE_min_load, LN, x0)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
#}


printf(newline)
printf(newline)

n_act = 4;
Vout_nom = 42;
Iout = 56;

%Determine Re
Re = ((8 * n_act^2)/pi^2)*(Vout_nom/Iout) % Full load Re
Re_overLoad = Re/1.1 % Over load Re @ 110%

%Determine Resonant Components

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MG = double(MG);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

QE = double(QE_maxLoad)
LN = double(LN)

%Initial Chosen Resonant Frequency, 90% of Fmax

fo = input('Enter The Resonant Frequency of choice: ' )
printf(newline)

QE_CR = QE;

printf(newline)
printf(newline)
printf('Resonant Capacitance')
printf(newline)

Cr = 1/(2*pi*fo*Re*QE_CR)

Cr_chosen = input('Enter Chosen Value for Cr : ' )

printf(newline)
printf(newline)
printf('Resonant Inductances and Normalized Inductance')
printf(newline)
Lr = 1/(((2*pi*fo)^2)*Cr_chosen)
printf(newline)
Lr_actual = (QE_CR*Re)^2 * Cr_chosen
%Qe_Cr_Chosen = sqrt(Lr/Cr_chosen)/Re
printf(newline)
Lr_chosen = input('Enter Chosen Value for Lr : ' )
Lm_required_for_Chosen_LN = LN*Lr_chosen
LM_chosen = input('Enter Chosen Value for LM : ' )
LN_act = LM_chosen/Lr_chosen


%Verify Design and Produce Gain graph



printf(newline)
printf(newline)

printf(newline)
printf(newline)
printf('Full load and Overload Q factors')
printf(newline)

%Quality Factor at Full load
Qe_act = sqrt(Lr_chosen/Cr_chosen)/Re

%Quality Factor at Overload
Qe_ovrld_act = sqrt(Lr_chosen/Cr_chosen)/Re_overLoad

 printf(newline)
 printf(newline)



% Finding Max Normalized frequency for Minimum Load

% Finding Max Normalized frequency for Minimum Load

    pout = input('Enter the minimum output load in watts : ' );

   % y  = sqrt(Lr_chosen/Cr_chosen)/((8 * n_act^2)/pi^2)*(Vout_nom^2/pout); % QE_min_load
    printf(newline)
    Qe_minimum_load_value = sqrt(Lr_chosen/Cr_chosen)/(((8 * n_act^2)/pi^2)*(Vout_nom^2/pout))
    printf(newline)
    Mg_Min
    x = input('For Minimum Gain Minimum load, Enter a value (knowing it will be divided by 100) for MG : ' );

    y = input('Knowing Qe_minimum_load_value above, Enter the value (knowing it will be divided by 1000) for QE : ' );

    x0 = input('Enter Decimal Value for initial Guess for Numaerical Solver : ' );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MG = sym(x)/100;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


QE_min_load = sym(y)/1000;
printf(newline)
Max_Norm_freq = Fn_calc(MG, QE_min_load, LN, x0)

printf(newline)
printf(newline)
printf('Design Frequencies')
printf(newline)
fo_act = 1/(2*pi*sqrt(Lr_chosen*Cr_chosen))
%fmin = double(Min_Norm_freq)*fo
fmin = 80000;
fmax = 250000;
%fmax = double(Max_Norm_freq)*fo
%FN_plot = [0.1:0.001:double(Max_Norm_freq)*1.5];
FN_plot  = [0.1:0.001:3];
%QE_plot = [0; double(QE_min_load); Qe_act; Qe_ovrld_act];
QE_plot  = [0; 0.35; 0.549; 0.60449];

for i = 1:size(QE_plot,1)
  for q = 1:size(FN_plot,2)
    MG(i,q) = (((3*FN_plot(q)^2))/((((3+1)*(FN_plot(q).^2)-1)+j*(((FN_plot(q)^2)-1).*FN_plot(q).*QE_plot(i)*3))))*1/1;
  endfor
endfor

%{
QE_plot = {0,"No Load"; Qe_minimum_load_value, "Min Load"; Qe_act, "Full Load"; Qe_ovrld_act, "Overload"};


figure()
%plot(FN_plot,abs(MG), 'MarkerSize', 10, 'LineWidth', 1.25, 'DisplayName', 'No load', 'DisplayName', 'Full Load', 'DisplayName', 'Overload')
plot(FN_plot,abs(MG), 'MarkerSize', 10, 'LineWidth', 1.25)

hold on
%semilogx(F_POS,F_cap_Q,'m','LineWidth', 1);
%semilogx(F_POS,F_cap_Q,'ro','LineWidth', 1,'MarkerSize', 5);
%title(['Design Rev ', num2str(Des_rev), " - MG_a_c_t_u_a_l vs F_n"] , 'fontsize', 25)

xlabel(" F_n (Normalized Frequency)",'fontsize', 24)
ylabel(" MG_a_c_t_u_a_l", 'fontsize', 24)
axis ([0, fmax/fo*1.4 , 0.6*0.79, 1.3*1.5])
© www.soinside.com 2019 - 2024. All rights reserved.