将用户输入转换为矩阵的符号变量

时间:2015-01-15 02:14:13

标签: matlab

我正在制作一个获取用户输入以帮助解决静态问题的程序,但是我遇到了一些困境。 这些问题要求用户为每个组件输入一组节点,然后为特定组件创建单独的向量,或者使用节点创建二次公式,取导数然后将其附加到主矩阵。现在我正在使用for循环,我不知道如何基于第i个值来命名向量,或者从用户的输入中创建一个符号变量。

以下是代码中存在问题的部分:

N = sym('a', k_number + 1);
for n = 1 : k_number %goes from 1 to the number inputted by the user
fprintf('Please enter the two nodes attached to spring %d\n', n) %requires the nodal number attached to the spring
num1 = input(''); %gets the first node value
num2 = input(''); %gets the second node value
N(n, num1) = sym('u%d%d', n, num1); %Suppose to replace value in N matrix with unique symbolic variable
N(n, num2) = sym('u%d%d', n, num2); %Suppose to replace value in N matrix with unique symbolic variable
end;

1 个答案:

答案 0 :(得分:0)

不要使用sym。请改用subs。这将象征性地用另一个表达式替换符号矩阵中的变量。我将假设num1num2将在每行的特定符号矩阵中选择两个唯一列。因此,做这样的事情:

N = sym('a', k_number + 1);
for n = 1 : k_number %goes from 1 to the number inputted by the user
    fprintf('\nPlease enter the two nodes attached to spring %d\n', n) %requires the nodal number attached to the spring
    num1 = input(''); %gets the first node value
    num2 = input(''); %gets the second node value
    old_var1 = ['a' num2str(n) '_' num2str(num1)]; %// CHANGE
    old_var2 = ['a' num2str(n) '_' num2str(num2)];
    new_var1 = ['u' old_var1(2:end)];
    new_var2 = ['u' old_var2(2:end)];
    N = subs(N, old_var1, new_var1); %// CHANGE
    N = subs(N, old_var2, new_var2); 
end

上面的代码将做的是,对于矩阵中的每一行,我们得到两个唯一的列号。然后,我们从每行的这两列中提取变量,并将它们从ax_y更改为ux_y。在我的机器上,当我创建N时,这就是我在k_number = 4

时获得的内容
N =

[ a1_1, a1_2, a1_3, a1_4, a1_5]
[ a2_1, a2_2, a2_3, a2_4, a2_5]
[ a3_1, a3_2, a3_3, a3_4, a3_5]
[ a4_1, a4_2, a4_3, a4_4, a4_5]
[ a5_1, a5_2, a5_3, a5_4, a5_5]

行号和列号由_字符分隔。现在,让我们来看看上面的代码。其中大部分是相同的,但改变的是我们将创建4个新字符串。其中两个将创建与您想要替换的变量对应的字符串。这是old_var1old_var2正在做的事情。接下来的两个将是与您要插入的新变量相对应的字符串,对应于new_var1new_var2。如果我正确理解您的问题,则变量需要从a更改为u。我们最终使用subs将此特定值替换为矩阵以替换这些变量。请注意,subs将返回整个表达式,因此无需为N中的特定位置分配输出。因此,我们将输出重新分配回N,以便它不断更新。

使用上面的代码,这是一个运行示例:

Please enter the two nodes attached to spring 1
1
2

Please enter the two nodes attached to spring 2
3
4

Please enter the two nodes attached to spring 3
1
5

Please enter the two nodes attached to spring 4
2
3

运行代码后,这是N

N =

[ u1_1, u1_2, a1_3, a1_4, a1_5]
[ a2_1, a2_2, u2_3, u2_4, a2_5]
[ u3_1, a3_2, a3_3, a3_4, u3_5]
[ a4_1, u4_2, u4_3, a4_4, a4_5]
[ a5_1, a5_2, a5_3, a5_4, a5_5]

正如您所看到的,每行的这些列都被从用户读入的相应列替换。对于每个列,变量都从a替换为u。你似乎没有更新最后一行,但我认为这是你要解决的问题之一。