我有一个优化问题,我想通过符号求解来优化厚度 t1、t2、t3
。解决方案应该大约是:
t1 = 1.72053;
t2 = 1.91395;
t3 = 0.781725;
%Given
M_y = 2000000; %[Nmm]
b = 100; %[mm]
E = 70000; %[N/mm^2]
k_Druck = 3.62;
k_Biegung = 21.7;
sigma_zul = 100; %[N/mm^2]
syms t1 t2 t3 positive
% center of gravity
zGes =(b^2*t1+b^2*t3)/(t1*b+t2*b+2*t3*b);
zSeite = zGes - b/2;
zUnten = b - zGes;
zOben= -zGes;
%area moment of inertia
I_y = 2*((t3*b^3/12)+zSeite^2*t3*b)+ ((b*t1^3/12)+zUnten^2*t1*b) + ((b*t2^3/12)+zOben^2*t2*b);
sigma_Oben = -M_y / I_y * zOben; %Stabilitätsversagen (druckbelastete Oberseite)
sigma_Unten = M_y / I_y * zUnten; %Festigkeitsversagen (zugbelasteten Unterseite)
sigma_krit_Oben =k_Druck * E * (t2/b)^2; %kritische Spannung Oberseite
sigma_krit_Seiten =k_Biegung * E * (t3/b)^2; %kritische Spannung Seitenwand
%% condition
Beulen_Oben = sigma_Oben == sigma_krit_Oben;
Beulen_Seiten= sigma_Oben == sigma_krit_Seiten;
Festig_Unten = sigma_Unten==sigma_zul;
%Solver
eqns = [Beulen_Oben,Beulen_Seiten,Festig_Unten];
vars = [t1, t2, t3];
[t1, t2, t3]=vpasolve(eqns,vars)
我尝试使用 Matlab 中的 vpasolve
函数解决该问题,但在 positive
条件下,该函数始终输出 Empty sym: 0-by- 1.
.当我输入给定的厚度解时,给定的条件几乎得到满足。由于我输入的小数位数,我认为它们有点偏差。
最佳答案
从数学意义上来说,这个系统可能有也可能没有实际的解(根)。 vpasolve
当找不到解决方案时,可以返回空解决方案,如文档中所述。有时,这可以通过在 initial guess as an optional third argument 上提供边界来解决。 。这并不总是有效,就像在本例中一样。如果方程的最小值刚刚触及零,但不穿过或几乎穿过零,但又不完全穿过,vpasolve 也会遇到麻烦。就您而言,这可能只是由于您选择的特定组合或参数值所致。
我建议通过 fsolve
以数值方式解决这个问题反而。您可以使用现有的符号数学代码,并使用matlabFunction
将方程转换为数值函数。 。第一步是使用 lhs
将等式的右侧移至左侧。和 rhs
功能:
eqns0 = lhs(eqns)-rhs(eqns);
然后您可以按照 fsolve
的预期将其转换为带有向量输入的数字匿名函数:
f = matlabFunction(eqns0, 'Vars', {vars});
然后选择一个初始猜测并调用fsolve
:
x0 = [1.7 1.9 0.8]; % Initial guess
[x, fval] = fsolve(f, x0)
在我的 R2023a 系统上,返回:
x =
1.7205 1.9139 0.7817
fval =
1.0e-12 *
0.0284 -0.1137 0.0426
对于这个方程组,解似乎对初始猜测不太敏感,但可能存在多个解。请参阅文档,了解如何调整收敛标准以将残差 fval
减小到接近于零。
关于matlab - 使用 Matlab 符号求解方程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76509094/