clc
clear
syms x y
f = x^3 -y^3 + 3*x^2 +3*y^2 -9*x;
df = jacobian(f);%求一阶偏导
d2f = jacobian(df);%求Hessian阵
[xx,yy] = solve(df)
xx = double(xx);
yy = double(yy);
for i = 1:length(xx)
a = subs(d2f,{x,y},{xx(i),yy(i)});
b = eig(a);
f = subs(f,{x,y},{xx(i),yy(i)});
f = double(f);
%求矩阵特征值
if all(b>0)
fprintf('(%f,%f)是极小值点,对应的极小值为%f\n',xx(i),yy(i),f);
elseif all(b<0)
fprintf('(%f,%f)是极大值点,对应的极大值为%f\n',xx(i),yy(i),f);
elseif any(b>0)&&any(b<0)
fprintf('(%f,%f)不是极值点\n',xx(i),yy(i));
else
fprintf('无法判断(%f,%f)是否是极值点\n',xx(i),yy(i));
end
end
为什么按照数学建模与算法这本书敲的程序得出的结果和书上不一样呢
可能是版本不同,函数用法有变化,你这样修改一下就可以了:
clc
clear
syms x y
f = x^3 -y^3 + 3*x^2 +3*y^2 -9*x;
df = jacobian(f);%求一阶偏导
d2f = jacobian(df);%求Hessian阵
[xx,yy] = solve(df);
xx = double(xx);
yy = double(yy);
for i = 1:length(xx)
a = subs(d2f,{x,y},{xx(i),yy(i)});
b = eig(a);
f = subs(f,{x,y},{xx(i),yy(i)});
f1 = xx(i)^3 -yy(i)^3 + 3*xx(i)^2 +3*yy(i)^2 -9*xx(i);
%求矩阵特征值
if all(b>0)
fprintf('(%f,%f)是极小值点,对应的极小值为%f\n',xx(i),yy(i),f1);
elseif all(b<0)
fprintf('(%f,%f)是极大值点,对应的极大值为%f\n',xx(i),yy(i),f1);
elseif any(b>0)&&any(b<0)
fprintf('(%f,%f)不是极值点\n',xx(i),yy(i));
else
fprintf('无法判断(%f,%f)是否是极值点\n',xx(i),yy(i));
end
end
运行结果:
【以下回答由 GPT 生成】
从提供的程序代码来看,问题很可能出在以下几个方面:
使用符号变量:程序中使用了sym
函数创建了符号变量,但问题描述中并没有提到具体的数值范围或初始条件,这可能导致计算的结果与书中给出的结果不同。解决方法是给变量指定合适的数值范围或初始条件。
符号计算的误差:MATLAB进行符号计算时,会出现计算误差。这可能导致程序得到的结果与书中给出的结果略有不同。解决方法是考虑使用实数计算或增加数值计算的部分。
函数求解的误差:程序中使用了solve
函数求解方程,这也可能导致结果的误差。解决方法是尝试使用其他求解方法或调整求解的选项。
总之,根据提供的代码,无法确定具体原因。建议尝试调整参数、使用数值计算、尝试其他求解方法等多种方式进行调试。如果问题仍然存在,可以提供更多的具体信息和上下文以获得更准确的解答。
【相关推荐】