用值替换变量,但不评估
Substitute variable with value, but don't evaluate
假设我有以下表达式:
(%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
而不计算表达式?
我已经搜索了手册,但没有找到任何看似相关的内容。
使用"empty"函数:
(%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)
Maxima 中的许多操作都是由一个名为 "simplification" 的过程执行的,这意味着应用恒等式来生成 "simpler" 表达式。例如。 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
值。
假设我有以下表达式:
(%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
而不计算表达式?
我已经搜索了手册,但没有找到任何看似相关的内容。
使用"empty"函数:
(%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)
Maxima 中的许多操作都是由一个名为 "simplification" 的过程执行的,这意味着应用恒等式来生成 "simpler" 表达式。例如。 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
值。