Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在尝试编写一个Matlab程序,该程序可以从用户那里接受系统的变量,但是变量多于系统参数。具体来说,三个方程式中包含六个变量:
w - d - M = 0 l - d - T = 0 N - T + M = 0 这可以用矩阵形式表示为A*x=0 ,其中 A = [1 0 0 -1 0 -1; 0 1 0 -1 -1 0; 0 0 1 0 -1 1]; x = [wl N d TM]'; 给定变量的已知子集,我希望能够解决该系统。例如,如果用户给出d , T , M ,则系统将对其他三个变量进行简单求解。如果用户提供w , N , M ,则它将成为可解决的3-DOF系统。等等。 (如果用户指定的系统过多或不足,则可能会导致错误。) 给定这些组合中的任何一种 ,(先验)使用矩阵代数来计算未知量很简单。但是除了使用符号工具箱(出于兼容性原因,我不愿意这样做)之外,我不知道如何解决一般情况。 当我开始使用这种方法时,我认为这一步很容易,但是我的线性代数是生锈的。我缺少一些简单的东西吗? 回答: 首先,令x为具有未知值NaN的向量。这使您可以使用ISNAN查找未知变量 。如果仅针对用户指定的术语计算A*x ,则将为您提供一列常数b。将这些常数放在等式的右侧,您将拥有A*x = -b形式的等式。 A = [1 0 0 -1 0 -1; 0 1 0 -1 -1 0; 0 0 1 0 -1 1]; idx = ~isnan(x); b = A(:,idx)*x(idx); % user provided constants z = A(:,~idx)\(-b); % solution of Ax = -b x(~idx) = z; 例如,使用输入x = [NaN NaN NaN 1 1 1]' ,您将得到结果[2 2 0 1 1 1]' 。它使用MLDIVIDE ,我不太熟悉线性代数,无法知道PINV还是其他更好的方法。 更多&回答... |
![]() |
![]() |