我正试图使用lsqnonlin求解一个由16个非线性方程组成的系统,该系统有16个未知数。
我的变量都取决于其他方程(exp:SegmaD是未知的,定义为(SegmaD=EpR2Teta(然后(Teta=fcr-Epcr/2*FT(然后Epcr=EpA/TX,正如你所看到的,EpA有一个if语句,所以我将所有变量定义为符号,但我遇到了一些错误,你不能将if语句与符号一起使用(我是Matlab的初学者(,所以我想通过用lsqnonlin替换其他有未知数要解的方程来构造我的16个方程,我如何用符号来实现这一点,然后求解给定的值?解决这个问题的最佳方法是什么?我附上了我的代码的一部分,以简要了解正在发生的事情。谢谢
代码:
syms Tx EpDs EpR EpA EpL K1 SegmaR Teta SegmaD FT EpT q AlphaD GamaLT
SegmaR(i) = Fcr*(EpR(i)/Epcr);
Teta(i) = 0.9/(sqrt(1+600*EpR(i))); % Teta is the Softening Coefficient equation 17
% K1 equation 16
if (EpA(i) < EpDs(i))
K1(i)= ((EpDs(i)/Ep0)*(1-(EpDs(i)/3*Ep0))-((EpA(i))^2)/(EpDs(i)*Ep0))*(1-((EpA(i)/3*Ep0)))*(EpDs(i)/(EpDs(i)-EpA(i)));
elseif (EpA(i)==EpDs(i))
K1(i)= ((2*EpDs(i)*Ep0)-EpDs(i)^2/Ep0^2); %K1 is a Dimensionless Parameter
end
SegmaD(i) = K1(i)*Teta(i)*fck; % SegmaD is the evolution of concrete compressive stress equation 15
EpT(i) = EpR(i)+EpD(i)-EpL(i); %equation 14
FT(i) = (Es*EpT(i))*(0.002+((1-0.002)/(1+((1-0.002)*(EpT(i)/EpSy))^4)^0.25)); % Equation 21
首先要注意,您只定义了14个符号变量,而没有用syms
定义16个。你也应该再次检查你的括号!有些是多余的,有些是缺失的。也不清楚你最终想用这些表达式做什么。但无论如何,一件重要的事情是,符号变量和符号函数,或者变量和函数通常不是同一回事。我看到的是,代码中的EpR
不是变量,而是t
的函数(我用t
更改了i
,因为t
对我来说更有意义,比如时间,而i
对我来说通常是整数计数器^_^(。要了解如何在Matlab中定义符号函数,请参阅其帮助页面https://uk.mathworks.com/help/symbolic/create-symbolic-functions.html或者这个https://uk.mathworks.com/help/symbolic/symfun.html.还有一件事是,当函数的方程根据某些条件而变化时,实际上你有一个分段函数。以下是Matlab中分段函数的帮助页面https://uk.mathworks.com/help/symbolic/piecewise.html,关于分段函数的一般定义,您可以查看其维基百科页面https://en.wikipedia.org/wiki/Piecewise.以下是我如何重写您的代码。你可能想知道为什么我有不同的syms
行,这只是因为我在你的代码中看到了许多不在符号行中的符号,所以我查看了你的代码,并为我遇到的每个符号添加了一个符号。你可以自己把它们做成一行。现在,如果运行此操作,则不会看到任何错误消息。
syms EpR( t )
syms Fcr
syms Epcr
syms SegmaR( t )
SegmaR( t ) = Fcr * ( EpR( t ) / Epcr );
syms Teta( t )
Teta( t ) = 0.9 / sqrt( 1 + 600 * EpR( t ) );
syms EpA( t )
syms EpDs( t )
syms Ep0
syms K1( t )
K1( t ) = piecewise( EpA( t ) < EpDs( t ), (EpDs( t ) / Ep0 ) * (1 - (EpDs( t )/ (3 * Ep0 ) )) - ((EpA( t ) ^ 2 ) / (EpDs( t ) * Ep0)) * (EpDs( t ) / (EpDs( t ) - EpA( t ))), EpA( t ) == EpDs( t ), 2 * EpDs( t ) * Ep0 - EpDs( t ) ^ 2 / Ep0 ^ 2 );
syms fck
syms SegmaD( t )
SegmaD( t ) = K1( t ) * Teta( t ) * fck;
syms EpR( t )
syms EpD( t )
syms EpL( t )
syms EpT( t )
EpT( t ) = EpR( t ) + EpD( t ) - EpL( t );
syms Es
syms EpSy
syms FT( t )
FT( t ) = Es * EpT( t ) * ( 0.002 + (1 - 0.002) / (1 + ((1 - 0.002) * (EpT( t ) / EpSy)) ^ 4) ^ 0.25);
% doing something to be sure symbolic functions are defined fine.
disp( diff( FT, t ));
您的">代码的一部分";不包括任何方程组。你可以编辑你的问题并将其包括在内。