关于FindRoot二分法的问题。
mathematica吧
全部回复
仅看楼主
level 6
冉qx
楼主
方程在(0,3)之间有根,运行却报错,怎样避免这种情况!
ff[x_] := Block[{},
sol = FindRoot[y^3 + y^2 + 1 + x == 0, {y, -1}];
x^2 + y /. sol]
ff[0]
ff[3]
FindRoot[ff[x] == 0, {x, 0, 3}, Method -> "Brent"]
2020年10月11日 16点10分
1
吧务
level 10
asdasd1dsadsa
FindRoot会先尝试进行符号代数化简,而你定义的ff仅可接受数值输入,所以报错。正统的解决方案是存在的,可参考 NumericFunction 帮助文档,了解如何定义一个符号函数的数值定义。
2020年10月11日 16点10分
2
asdasd1dsadsa
@冉qx
HoldAll不意味着永不计算,它仅仅是(在传参时)阻止计算子表达式一次。你可以看看这两个例子的区别 {Function[x,Hold@x,HoldAll][1+1],Function[x,Hold@#&@x,HoldAll][1+1]}
2020年10月21日 16点10分
asdasd1dsadsa
@xzcyr
我觉得此贴可以放到“常见问题”一栏里
2020年10月11日 16点10分
冉qx
为啥FindRoot有HoldAll属性还会先进行符号化简
2020年10月21日 15点10分
冉qx
@asdasd1dsadsa
为啥FindRoot有HoldAll属性还会先进行符号化简
2020年10月21日 15点10分
吧务
level 10
asdasd1dsadsa
ClearAll@f
SetAttributes[f, NumericFunction]
f /: N[f[x_], _] := x^2 + y /. FindRoot[y^3 + y^2 + 1 + x == 0, {y, -1}]
f[x_?InexactNumberQ] := x^2 + y /. FindRoot[y^3 + y^2 + 1 + x == 0, {y, -1}]
N@*f/@{0,3}
Plot[f@x,{x,0,3}]
FindRoot[f@x == 0, {x, 0, 3}]
2020年10月11日 16点10分
3
asdasd1dsadsa
如果不需要精度控制,只需对f[x_?NumericQ]定义即可
2020年10月11日 17点10分
xzcyr
@asdasd1dsadsa
补一句,_?NumericQ 应该算是比较普遍(也较易掌握)的做法。一般走不到要用 NumericFunction 的那一步。
2020年11月06日 17点11分
1