matlab - 使用 Matlab 符号求解方程组

标签 matlab symbolic-math equation-solving

我有一个优化问题,我想通过符号求解来优化厚度 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/

相关文章:

在命令窗口或独立绘图中通过 LaTeX 进行 MATLAB 和数学方程式?

matlab - 是否可以为 matlab 构建一个大内存系统?

matlab - 如何在Matlab中不使用嵌套循环的情况下最有效地比较坐标对?

algorithm - Maple中如何查看函数/方法的源码实现?

用于代数简化和求解的 C# 库

c - 如何求解 4 个变量的方程

matlab - 元胞数组中所有元素的长度向量?

julia - Julia 中的符号数学?

python - 在Python中求解非线性方程: the answer is the same as initial guess

wolfram-mathematica - 数学 : FindRoot errors