带元素操作的MATLAB符号输出

时间:2014-01-22 19:09:13

标签: matlab symbolic-math

是否有将MATLAB的符号表达式转换为可以按元素方式计算的表达式的函数或技术?

例如,命令

a = solve('x^2 + a*x + b == 0')

给出输出

a = 
   (a^2 - 4*b)^(1/2)/2 - a/2
 - a/2 - (a^2 - 4*b)^(1/2)/2

然而,允许ab为数组的所需输出是

a = 
   (a.^2 - 4*b).^(1/2)/2 - a/2
 - a/2 - (a.^2 - 4*b).^(1/2)/2

3 个答案:

答案 0 :(得分:5)

solve('x^2 + a*x + b == 0')返回2x1 sym。我知道你想要评估各种a和b值的解决方案。为此,首先需要使用matlabFunction将sym转换为函数。

s = solve('x^2 + a*x + b == 0');
f = matlabFunction(s);

现在f是两个输入参数a和b的函数。在三个a和b值的两个向量上尝试:

f([1 2 3],[1 1 1])

您将获得2x3阵列的解决方案。

您还可以使用subs来实现您想要的目标:

subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]})

将替换[1 2 3]代表a和[1 1 1]代替b并返回2x3 sym。如果你想评估它,只需使用eval:

eval(subs(s,{'a' 'b'},{[1 2 3 ] [1 1 1]}))

答案 1 :(得分:1)

要获得您要求的字符串,有一个MATLAB函数来执行此操作。它被称为vectorize

在此处查看更多信息in the MATLAB documentation。该函数插入一个。在任何^,*或/之前。结果是一个字符串。

答案 2 :(得分:0)

我相信你有几个转换操作。

你实际上可以用(a。^ 2 - 4 * b)替换它。^(1/2)/ 2 - a./2

我建议使用3种不同的解决方案,具体取决于表达式中有多少个不同的变量:

  • 如果你只有不到几十个变量,可能更容易做一个“CTRL-F”(搜索和替换),并用等效的“var”替换每个变量“var”。在你的代码中。一定要检查“整个单词”。 这应该不到一分钟。
  • 如果您的变量少于几十个,但表达式分为几个不同的文件,您可能需要下载notepad ++并执行相同的操作。 Notepadd ++添加了一个搜索选项&直接替换文件夹和子文件夹而不是文件。这样可以节省很多时间。
  • 如果您有许多不同的变量,您可能需要查看regexp,并对文件中出现的每个字符串执行搜索并替换为reg表达式。创建一个新的matlab函数,它将以您需要的方式实现regexprep。

编辑:我刚注意到你需要小心括号。

(a。^ 2 - 4 * b)。^(1/2)/ 2 - a./2有效 (a。^ 2 - 4 * b。)。^(1/2)/ 2 - a./2不起作用

所以如果你使用CTRL-F方法,你需要在结尾处用“var。”替换“var。”“