【问题标题】:Substitute variable with value, but don't evaluate用值替换变量,但不计算
【发布时间】:2017-04-05 03:09:39
【问题描述】:

假设我有以下表达式:

(%i1) (8*x)*(log(x) / log(10));

(%i2) X^2;

现在,因为我想找出我可以选择什么常量值来使声明 %i1 is O(%i2) 为真,所以我在这样的循环中评估它们:

for a:1 thru 10 do print(%i1, "=", ev(%i1, x=a), %i2, "=", ev(%i2, numer, x=a));

输出是:

8 x log(x)          2
---------- = 0.0 , x  = 1 
 log(10)

8 x log(x)                        2
---------- = 4.816479930623698 , x  = 4 
 log(10)

8 x log(x)                        2
---------- = 11.45091011327189 , x  = 9 
 log(10)

8 x log(x)                        2
---------- = 19.26591972249479 , x  = 16 
 log(10)

8 x log(x)                        2
---------- = 27.95880017344075 , x  = 25 
 log(10)

8 x log(x)                        2
---------- = 37.35126001841489 , x  = 36 
 log(10)

8 x log(x)                        2
---------- = 47.32549024079837 , x  = 49 
 log(10)

8 x log(x)                        2
---------- = 57.79775916748438 , x  = 64 
 log(10)

8 x log(x)                        2
---------- = 68.70546067963139 , x  = 81 
 log(10)

8 x log(x)           2
---------- = 80.0 , x  = 100 
 log(10)

我想让输出更容易吸引眼球,例如:

8 1 log(1)          2
---------- = 0.0 , 1  = 1 
 log(10)

8 2 log(2)                        2
---------- = 4.816479930623698 , 2  = 4 
 log(10)

8 3 log(3)                        2
---------- = 11.45091011327189 , 3  = 9 
 log(10)

[snip]

8 10 log(10)           2
---------- = 80.0 , 10  = 100 
 log(10)

如何告诉 Maxima 在循环的每次迭代中将 a 的值替换为 x 而无需计算表达式?

我已经搜索了手册,但没有找到任何看似相关的内容。

【问题讨论】:

    标签: maxima


    【解决方案1】:

    Maxima 中的许多操作都是通过一个称为“简化”的过程来执行的,这意味着应用恒等式来制作“更简单”的表达式。例如。 1 + 1 化简为 2,sin(0) 化简为 0,等等。

    为了得到你想要的效果,我们必须在一般情况下禁用简化,以便表达式被评估但不被简化。但要获得数值,我们需要为这些结果启用简化。

    这是可以做到的。

    (%i16) simp : false $
    (%i17) for x in [1,2,3,4,5]
             do print (ev(%i1) = ev(%i1, simp, numer), ev(%i2) = ev(%i2, simp));
           log(1)          2
    (8 1) (-------) = 0.0 1  = 1
           log(10)
           log(2)                        2
    (8 2) (-------) = 4.816479930623698 2  = 4
           log(10)
           log(3)                       2
    (8 3) (-------) = 11.4509101132719 3  = 9
           log(10)
           log(4)                        2
    (8 4) (-------) = 19.26591972249479 4  = 16
           log(10)
           log(5)                        2
    (8 5) (-------) = 27.95880017344075 5  = 25
           log(10)
    (%o17)                               done
    

    请注意,我写的是for x in [1, 2, 3, 4, 5] ... 而不是for x:1 thru 5 ...。那是因为后者使用算术,这需要简化。两种方法都试一下,我想你会看到不同的,而且我相信这很有启发性。

    注意,我使用了与您相同的 %i1%i2 值。

    【讨论】:

      【解决方案2】:

      使用“空”功能:

      (%i1) display2d: false $
      (%i2) prefix("") $
      (%i3) almost_subst(a, x, e):= subst(""(a), x, e) $
      (%i4) almost_subst(10, x, 8*x*log(x)/log(10));
      (%o4) (8* 10*log( 10))/log(10)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-27
        相关资源
        最近更新 更多