如何在Matlab中使用fsolve命令求解四次多项式的曲线转折点
Matlab衔接fsolve求解极值点的实现方案
核心衔接卡点
卡住的核心是Matlab符号计算对象和数值求解器的输入类型不匹配:
- 你通过
diff计算得到的f1是符号(sym)类型的数学表达式,仅能在符号计算场景下做化简、求导类运算 fsolve属于数值迭代类求根工具,要求输入的是可代入具体数值、返回数值结果的函数句柄,无法直接识别sym类型的表达式作为输入
完整可运行代码
在你已编写的符号计算流程基础上,补充符号转数值函数、设置迭代初始值、调用fsolve的环节即可,逐行注释说明:
% 1. 已完成的符号计算流程:定义符号变量、目标函数、计算一阶导数 syms x f = x^4 - 8*x^3 + 24*x^2 - 32*x; f1 = diff(f, x, 1) % 运行后f1的展开结果为4*x^3 - 24*x^2 + 48*x - 32,和手动求导的推导结果完全一致 % 2. 关键衔接步骤:将符号类型的导数表达式转换为fsolve可识别的数值函数句柄 f1_fun = matlabFunction(f1); % 3. 为fsolve设置初始迭代点(数值迭代方法必须提供初始搜索位置) x0 = 0; % 本函数为全局光滑的多项式,任意合理的初始值都可收敛到正确解 % 4. 调用fsolve求解一阶导数为0的位置 % 输出说明:x_sol为求解得到的极值点位置,fval为该点处的导数值(应趋近于0,可验证求解精度) [x_sol, fval] = fsolve(f1_fun, x0)
运行结果说明
执行上述代码后,fsolve仅需几次迭代就会收敛,得到的x_sol会和你手动推导的x=2匹配(默认精度下可能是1.9999997这类近似值,属于数值迭代的正常误差范围),fval会是1e-10量级的趋近于0的数值,验证求解的正确性。
注意:本问题的一阶导数在x=2位置是三重根(因式分解结果为
4*(x-2)^3),fsolve默认的求解容差对这类重根的求解精度略低,如果需要更接近精确值的结果,可以通过优化选项调整容差参数:
% 可选:调整求解精度,适配重根场景 options = optimoptions('fsolve', ... 'FunctionTolerance', 1e-12, ... 'StepTolerance', 1e-12); [x_sol, fval] = fsolve(f1_fun, x0, options)
常见踩坑提醒
不要直接将sym类型的f1作为参数传给fsolve,比如编写fsolve(f1, 0)这类代码,Matlab会直接抛出输入类型不匹配的错误,这是符号计算与数值计算衔接时最容易遗漏的环节。
内容的提问来源于stack exchange,提问作者amateurcoder
相关产品推荐
相关产品推荐

