You need to enable JavaScript to run this app. 如何在Matlab中使用fsolve命令求解四次多项式的曲线转折点
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.01 19:15:04