【问题标题】:Converting string to illegal/unsupported expression in Mathematica.在 Mathematica 中将字符串转换为非法/不支持的表达式。
【发布时间】:2011-10-15 17:08:11
【问题描述】:

我需要在 Mathematica 函数 Series[ ] 中输入一个变量,比如 var,如下所示:Series[A^2+B^2+C^2, var]。 Series[ ] 的语法如下:

Series[f, {x, x_0, n}] 为 f 生成一个关于点 x=x_0 的幂级数展开以阶 n.
Series[f, {x, x_0, n}, {y, y_0, m}, ...] 依次找到关于 x、y 等的级数展开式。

因为我并不总是在一维中计算 Series[ ](即,BC 在每次迭代中并不总是变量),var 必须正确格式化以适应维度需求。需要注意的是,Mathematica 喜欢列表,因此任何退化的表都会有一组外部 {}

假设我之前的代码生成了以下两组集合:

表[1]= {{A, 0, n}};
表[2]= {{A, 0, n}, {B, 0, m}}; .

我最好的想法是使用字符串操作(对于 i= 2):

string = ToString[table[i]]; .
str = StringReplacePart[string, {" ", " "}, {{1}, {StringLength[string], StringLength[string]}}]

下一步是将str 转换为var 之类的表达式并通过var= ToExpression[str] 执行Series[A^2 + B^2 + C^2, var],但这会返回以下错误:

ToExpression::sntx:“{A, 0, n}, {B, 0, m}”中或之前的语法无效。
$失败

帮助将str 正确地转换为表达式或提出另一种处理此问题的方法。

【问题讨论】:

    标签: string wolfram-mathematica expression multidimensional-array taylor-series


    【解决方案1】:

    如果我理解正确,你有

    table[2] = {{A, 0, n}, {B, 0, m}};
    

    并试图从中获取

    Series[f[A,B],{A,0,n},{B,0,m}]
    

    这可以使用Sequence 来完成,就像这样(我将使用series 而不是Series 来保持它不被评估,这样你就可以看到发生了什么):

    series[f[A, B], Sequence @@ table[2]]
    (*
    -> series[f[A,B],{A,0,n},{B,0,m}]
    *)
    

    例如

    table[3] = {{A, 0, 2}, {B, 0, 2}};
    Series[f[A, B], Sequence @@ table[3]]
    

    给出正确的系列展开。

    【讨论】:

      【解决方案2】:

      您可以使用FirstLast 或更一般地使用Part 来获得您想要的List。例如,

      var = {{x, 0, 3}, {x, 0, 5}};
      Series[1/(1 + x), var[[1]]]
      
      Out[1]= 1 - x + x^2 - x^3 + O[x]^4
      
      Series[1/(1 + x), var[[2]]]
      
      Out[2]= 1 - x + x^2 - x^3 + x^4 - x^5 + O[x]^6
      

      编辑:

      对于多个变量,您可以像这样使用SlotSequence (##) 和Apply (@@):

      Series[Sin[u + w], ##] & @@ {{u, 0, 3}, {w, 0, 3}}
      

      【讨论】:

      • 是的,这确实适用于从列表中选择一组参数。但是如果我想做Series[1/(1 + x+y), {x, 0, 3}, {y, 0, 5}]呢?我想到了一种我现在正在研究的迭代方法。
      • 迭代方法(请注意,从数学的角度来看,使用 x 然后 y 或 y 然后 x 进行泰勒近似没有区别):假设在您的迭代过程中,您知道您将使用 table [2],然后执行以下操作: > S= Normal[Series[A^2+B^2+C^2, tables[2][[1]]]]; (* Normal[ ] 放弃 O(n) 表示法*) For[k = 2, k S = Normal[Series[S, table[2][[k]] ; > ];所以这相当于S= Normal[Series[A^2+B^2+C^2, tables[2][[1]], tables[2][[2]]]];
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 2012-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多