关于程序嵌套的问题
mathematica吧
全部回复
仅看楼主
level 3
我想问一下这个报错应该如何解决
findBinaryCriticalValueOptimized[start_, end_, precision_] :=
Module[{left = 1, right = 4, mid, fLeft, fRight, fMid, iter = 0,
maxIter = 20, amp},(*初始化函数值*)amp = left;
NotebookEvaluate[
"A", InsertResults -> True];
fLeft = ampp;
amp = right;
NotebookEvaluate[
"A", InsertResults -> True];
fRight = ampp;
(*检查区间有效性*)
If[fLeft == fRight,
Return["错误:函数在区间端点值相同,请调整起始和结束值。f(left) = " <> ToString[fLeft] <>
", f(right) = " <> ToString[fRight]]];
Print["开始搜索0/1跳变的临界值..."];
Print["初始区间: [", left, ", ", right, "]"];
Print["f(left) = ", fLeft, ", f(right) = ", fRight];
Print["目标精度(区间长度): ", precision];
While[iter < maxIter && Abs[right - left] > precision, iter++;
mid = (left + right)/2;
(*设置当前变量值并运行笔记本*)amp = mid;
NotebookEvaluate[
"A", InsertResults -> True];
fMid = ampp;
Print["迭代 ", iter, ": amp = ", mid, ", f(p) = ", fMid, ", 区间长度 = ",
Abs[right - left]];
(*更新区间*)If[fMid == fLeft, left = mid, right = mid];];
Print["*** 搜索完成 ***"];
Print["最终区间: [", left, ", ", right, "]"];
Print["区间长度: ", Abs[right - left]];
Print["迭代次数: ", iter];
(*返回区间的中点作为最佳估计*)Return[(left + right)/2]]
(*执行搜索*)
criticalValue =
findBinaryCriticalValueOptimized[startValue, endValue,
desiredPrecision]
Out[4]= "错误:函数在区间端点值相同,请调整起始和结束值。f(left) = ampp, f(right) = ampp"
这个是另一个程序
测试
Global`ampp
If[amp > 2.09583, ampp = 1, ampp = 0]
originalNb = NotebookFileName[];
If[originalNb =!= $Failed, base = DirectoryName[originalNb];
nameBase = FileBaseName[originalNb];
newName = nameBase <> "_" <> ToString[amp] <> ".nb";
newPath = FileNameJoin[{base, newName}];
NotebookSave[EvaluationNotebook[], newPath];
Print["程序已保存为: ", newPath], Print["未保存的笔记本,请先手动保存"]]
2025年09月23日 11点09分 1
吧务
level 15
你的 startValue, endValue, desiredPrecision 都在哪?如果还没看,请务必把精品区《有的字母蓝,有的字母黑,你知道为什么吗?你对语法着色有认识吗》那帖看了。
2025年09月23日 12点09分 2
吧务
level 15
……等一下,定睛一看,你这 startValue, endValue, desiredPrecision 根本没用上啊?你该不会是觉得 Module 里面的那个 amp 可以传递给 笔记本 "A" 吧?如果是的话,那么,你的 Module 的局部化逻辑的理解完全是错的。对于Module,Block,With等局部化结构,我还是那句话:如果你看完了文档依旧不知道他们有什么用,那么不妨先别管它们,将来你需要它们的时候自然能学会。现阶段只要会用括号和分号就行了。绝对不要因为“带着Module、Block的代码看起来很专业”或是“我看大家都在这么用所以我也要用”之类的愚蠢理由强行在自己的代码里用这些函数。
2025年09月23日 12点09分 3
吧务
level 15
你这代码最简单的改法就是把Module 改成 CompoundExpression。
2025年09月23日 12点09分 4
好的好的,我马上去试试,刚刚在看精品区的帖子,感觉学这个真的好难啊大佬[泪]
2025年09月23日 12点09分
@排空驭气奔如电 ……如果你现在还是初学,那我强烈建议你先别搞这分割笔记本的花活儿了。
2025年09月23日 12点09分
@xzcyr 好的佬,我主要是想写一个自动化程序去方便计算,结果似乎有点南辕北辙了[泪][泪][泪]
2025年09月23日 13点09分
1