给出一个表达式(多项式,或一般的任何方程),如
a s^2+b = 0
Run Code Online (Sandbox Code Playgroud)
我想解决s ^ 2,得到s ^ 2 = -b/a.我们都知道,不能只写
Solve[eq==0,s^2]
Run Code Online (Sandbox Code Playgroud)
因为s ^ 2不是'变量'.只有s是'变量'.所以我做的是
eq = a s^2+b;
sol = First@Solve[eq==0/.s^2->z,z];
z/.sol
-(b/a)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法在没有中间变量替换的情况下完成上述操作?我尝试了很多命令,但没有成功(减少,收集,消除,因素等等).
谢谢 - 纳瑟
Mathematica 8.0.1
任何人都可以解释这个结果背后的逻辑
In[24]:= Round[10.75, .1]
Out[24]= 10.8
In[29]:= Round[2.75, .1]
Out[29]= 2.8000000000000003
Run Code Online (Sandbox Code Playgroud)
我预计上面的第二个结果是2.8?
编辑1:
我正在尝试上面的格式化目的只是为了使数字适合空间.我最终做了以下以获得我想要的结果:
In[41]:= NumberForm[2.75,2]
Out[41] 2.8
Run Code Online (Sandbox Code Playgroud)
我希望Mathematica有printf()之类的格式化功能.我在Mathematica中找到了确切字段宽度的格式编号,与使用printf()格式规则相比,形成了一点尴尬.
编辑2:我尝试$ MaxExtraPrecision = 1000我试图格式/回合的一些数字,但它没有用,这就是我发布这个问题的原因.这里是
In[42]:= $MaxExtraPrecision=1000;
Round[2035.7520395261859,.1]
Out[43]= 2035.8000000000002
In[46]:= $MaxExtraPrecision=50;
Round[2.75,.1]
Out[47]= 2.8000000000000003
Run Code Online (Sandbox Code Playgroud)
我找到了这种方法,只将数字格式化为一个小数点.使用Numberform,但首先需要通过计算小数点左边的位数来找到要使用的n位精度,然后加1.
In[56]:= x=2035.7520395261859;
NumberForm[x,IntegerLength[Round@x]+1]
Out[57]//NumberForm= 2035.8
Run Code Online (Sandbox Code Playgroud)
以上(编辑3)不适用于诸如此类的数字
a=2.67301785 10^7
Run Code Online (Sandbox Code Playgroud)
经过一些试验,我找到了会计表来做我想做的事.AccountingForm摆脱了NumberForm没有的10 ^ n形式:
In[76]:= x=2035.7520395261859;
AccountingForm[x,IntegerLength[Round@x]+1]
Out[77]//AccountingForm= 2035.8
In[78]:= x=2.67301785 10^7;
AccountingForm[x,IntegerLength[Round@x]+1]
Out[79]//AccountingForm= 26730178.5
Run Code Online (Sandbox Code Playgroud)
为了格式化数值,我找到的最好的语言是Fortran,遵循COBOL以及那些使用或支持printf()标准格式的语言.使用Mathematica,我可以肯定会做这样的格式化,但对我来说这看起来确实太复杂了.我从未理解为什么数学没有Printf [].
我不知道之前是否有人询问过这件事.简单的格式化问题.我注意到有时很难将评论(----)排在彼此之上.必须是字体类型问题.如果我可以让事情完全相互对齐,它在屏幕上看起来会好一点.这是一个例子:
(* *)
(* L E F T P A N E L *)
(* *)
Run Code Online (Sandbox Code Playgroud)
但它实际上在我面前的笔记本中看起来像这样:
如果我在第二行中向左移动一个空格,它就像这样:
所以,不能让它对齐.我正在使用Input(标准单元格)类型的单元格.
我不能使用其他细胞类型,如Code等.我想知道是否有人知道让这个对齐的技巧.
谢谢
编辑1:在样式表演示中显示输入单元格使用的字体
编辑2:使用Alexey Popkov下面显示的代码修复了注释的字体问题,现在它们很容易对齐.这是一个截屏
编辑3:
好吧,党不会持续很长时间.在演示中不允许使用SetOptions.太糟糕了,因为Alexey的解决方案效果很好,并使评论保持一致并且看起来更好.
无论如何.真的没什么大不了的.可以忍受一点点错位评论:)
任何人都知道一个工具来找到源级别的2个笔记本之间的差异?
工作台2中的比较笔记本工具似乎在内部数据结构级别工作,这对我没用.我正在寻找能够查看源级差异的工具(在查看笔记本时看到的内容,即不是FullForm).
我在Windows上使用Mathematica的V8.
EDIT1:
我如何以更易读的形式显示NotebookDiff的输出/报告?
我仍然不能很好地使用Mathematica中的列表来实现功能.这是一个小问题,我想问一下什么是一个很好的功能解决方法.
我说以下列表由点组成.因此,每个元素是一个点的坐标(x,y).
a = {{1, 2}, {3, 4}, {5, 6}}
Run Code Online (Sandbox Code Playgroud)
我想遍历这个列表,每当我找到一个y坐标为> 3.5的点时,我想生成一个复杂的共轭点.最后,我想返回生成的点列表.因此,在上面的例子中,有2个点可以满足这个条件.因此,最终列表中将有5个点,3个原始列表和2个复共轭点.
我试过这个:
If[#[[2]] > 3.5, {#, {#[[1]], -#[[2]]}}, #] & /@ a
Run Code Online (Sandbox Code Playgroud)
但我明白了
{{1, 2}, {{3, 4}, {3, -4}}, {{5, 6}, {5, -6}}}
Run Code Online (Sandbox Code Playgroud)
你会看到中间的额外{},我必须添加一个复共轭点.我希望结果是这样的:
{{1, 2}, {3, 4}, {3, -4}, {5, 6}, {5, -6}}
Run Code Online (Sandbox Code Playgroud)
我尝试插入Flatten,但没有工作,所以,我发现自己有时会回到我原来的程序方式,并使用像Table和Do这样的东西:
a = {{1, 2}, {3, 4}, {5, 6}}
result = {};
Do[
If[a[[i, 2]] > 3.5,
{
AppendTo[result, a[[i]]]; AppendTo[result, {a[[i, 1]], -a[[i, 2]]}]
},
AppendTo[result, a[[i]]]
],
{i, 1, Length[a]}
]
Run Code Online (Sandbox Code Playgroud)
这给了我想要的东西,但不是功能性解决方案,我不喜欢它.
什么是解决这种列表操作的最佳功能方法? …
这个问题是关于在M中通过引用的主题(我的相关问题是关于在函数之间传递数据的简单问题)
虽然我试图找到一种方法来通过引用传递东西而不使用Unevaluted[]
或者HoldFirst[]
,但是我错误地使用了这种方法并且看起来对我来说效果很好,即使我不理解它是如何工作的以及使用它的任何隐藏风险.所以我想在这里向专家展示,并询问他们是否认为使用是安全的(我有非常大的演示,需要将参数打包成不同结构的数量来帮助管理它们,这就是我发现这个的方法我正在尝试的方法).
这是方法:首先我们知道不能写下面的内容:
Remove[p]
foo[p_] := Module[{u},
u = Table[99, {10}];
p = u
];
p = 0;
foo[p];
Run Code Online (Sandbox Code Playgroud)
在上面更新"p"的一种方法是更改为调用成为
foo[Unevaluated@p];
Run Code Online (Sandbox Code Playgroud)
或者通过定义foo[]
与HoldFirst
.
但这是我发现的方式,它通过引用传递,没有这些:
我将所有参数放在一个结构中(我现在无论如何都这样做),并传递结构,然后可以更新结构内部的字段,foo[]
更新将反映在函数调用的后面:
Remove[parms]
foo[parms_] := Module[{u},
u = Table[99, {10}];
parms["p"] = u
];
parms["p"] = 0;
foo[parms];
Run Code Online (Sandbox Code Playgroud)
现在,parms["p"]
包含新列表{99, 99, 99, 99, 99, 99, 99, 99, 99, 99}
所以,parms
内部被覆盖/更新foo[]
,我不必告诉M parms
通过引用传递!
我在我的程序中试过这个,我看到没有奇怪的副作用.CDF更新正常,没有错误.我不知道这是如何工作的,可能是M parms
将此示例中的所有字段视为全局?
但无论哪种情况,我都很满意,因为它为我提供了一种将我的许多参数打包成结构的方法,同时我能够在函数内部更新结构.
但我的问题是:你看到这种方法存在重大问题吗?它在内部如何运作?我的意思是如何处理中号这逝去的没有我做的HoldFirst
还是Unevaluated …
(Mathematica版本:8.0.4)
lst = Names["Internal`*"];
Length[lst]
Pick[lst, StringMatchQ[lst, "*Bag*"]]
Run Code Online (Sandbox Code Playgroud)
给
293
{"Internal`Bag", "Internal`BagLength", "Internal`BagPart", "Internal`StuffBag"}
Run Code Online (Sandbox Code Playgroud)
Mathematica编程指南作者:迈克尔·特罗特,第494页,内部背景说
"但与Experimental`上下文相似,不能保证在Mathematica的更高版本中仍然可以使用这些函数的行为和语法"
另外,这里提到的Bag
功能:
但是,由于我已经看到Mathematica专家在这里建议Internal`Bag
功能并自己使用它们,我假设在实际代码中使用它们会有点安全吗?若然,我有以下问题:
我在哪里可以找到这些函数(API等)的更正式的描述,就像在文档中心找到的那样? 现在没有任何关于他们的事情
??Internal`Bag
Internal`Bag
Attributes[Internal`Bag]={Protected}
Run Code Online (Sandbox Code Playgroud)
如果我开始使用它们,我会发现很难通过查看一些示例和反复试验来了解它们的功能.我想知道这里是否有人可能有一个更完整和自包含的文档,使用这些,描述API和更多已经存在的内容或链接到这样的地方.
简单的问题,给出这样的列表
Clear[a, b, c, d, e, f];
lst = {{a, b}, {c, d}, {e, f}};
Run Code Online (Sandbox Code Playgroud)
并假设我有一个这样定义的函数:
foo[x_,y_]:=Module[{},...]
Run Code Online (Sandbox Code Playgroud)
我想将此功能应用于列表,所以如果我输入
Map[foo, lst]
Run Code Online (Sandbox Code Playgroud)
这给了
{foo[{a, b}], foo[{c, d}], foo[{e, f}]}
Run Code Online (Sandbox Code Playgroud)
我想要它出来
{foo[a, b], foo[c, d], foo[e, f]}
Run Code Online (Sandbox Code Playgroud)
所以它有效.
做这个的最好方式是什么?假设我无法修改函数foo []定义(假设它是内置函数)
我现在只知道两种方式
Map[foo[#[[1]], #[[2]]] &, lst]
{foo[a, b], foo[c, d], foo[e, f]}
Run Code Online (Sandbox Code Playgroud)
(太多的工作),或
MapThread[foo, Transpose[lst]]
{foo[a, b], foo[c, d], foo[e, f]}
Run Code Online (Sandbox Code Playgroud)
(减少输入,但需要先转置)
问题:还有其他更好的方法吗?我看了看其他地图和它的朋友,我看不到比我拥有的更直接的功能.
我刚刚更新到 notepad++ V 8.1.3,它不再提供在左侧面板中显示打开文件的选项。
如何再次启用文档列表面板?我也看了这个问题notepad-show-open-files-on-the-left,但他们都说同样的事情
Settings > Preferences > tab General > Document List Panel > check Show
Windows 10 的 8.1.3 版本中不再存在该功能
我之前没有使用过PackedArray,但是今天就开始考虑使用它们来阅读它们.
我所拥有的是所有实数的大尺寸1D和2D矩阵,没有符号(它是有限差分PDE求解器),所以我认为我应该利用PackedArray.
我有一个初始化函数,我分配所需的所有数据/网格.所以我去ToPackedArray
了他们.它似乎更快一点,但我需要做更多的性能测试,以更好地比较前后的速度,并比较RAM的使用情况.
但是当我看到这个时,我注意到M中的一些操作已经自动返回PackedArray中的列表,而有些则没有.
例如,这不会返回打包数组
a = Table[RandomReal[], {5}, {5}];
Developer`PackedArrayQ[a]
Run Code Online (Sandbox Code Playgroud)
但这样做
a = RandomReal[1, {5, 5}];
Developer`PackedArrayQ[a]
Run Code Online (Sandbox Code Playgroud)
这样做
a = Table[0, {5}, {5}];
b = ListConvolve[ {{0, 1, 0}, {1, 4, 1}, {0, 1, 1}}, a, 1];
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
并且矩阵乘法确实在打包数组中返回结果
a = Table[0, {5}, {5}];
b = a.a;
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
但元素乘法不是
b = a*a;
Developer`PackedArrayQ[b]
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有一个列表哪个文件哪个M命令返回PackedArray而不是?(假设数据符合要求,例如Real,不混合,没有符号等.)
另外,一个小问题,你认为在调用ToPackedArray
它之前首先检查创建的列表/矩阵是否已经打包会更好吗?我认为呼叫ToPackedArray
已经打包的列表不会花费任何费用,因为呼叫将立即返回.
谢谢,
更新(1)
只是想提一下,刚发现在演示CDF中不允许使用PackedArray符号,因为我在上传一个时遇到错误.所以,不得不删除我的所有包装代码.由于我主要编写演示,现在这个主题对我来说只是学术兴趣.但是要感谢大家的时间和好的答案.