MATLAB隐函数报错

老哥们,MATLAB画个隐函数报错这个问题出在哪啊

syms D G R;

f=@(D,G,R)(G.^2)+(G.(D+R-1)./(3.774*(R-1).*10^-3))+(0.3394*(D+R)./(R-1));
R=0;
ff=@(D,G)f(D,G,R);
fimplicit(ff,[1 10 10^-6 10^7])

报错就报这个,本人刚刚接触MATLAB,只是想画个图,请指点迷津


警告: 函数处理数组输入时行为异常。要改善性能,请将您的函数正确向量化,以返回大小和形状与输入参数相同的输出。 
> In matlab.graphics.function.ImplicitFunctionLine>getFunction
  In matlab.graphics.function.ImplicitFunctionLine/updateFunction
  In matlab.graphics.function.ImplicitFunctionLine/set.Function_I
  In matlab.graphics.function.ImplicitFunctionLine/set.Function
  In matlab.graphics.function.ImplicitFunctionLine
  In fimplicit>singleFimplicit (line 189)
  In fimplicit>@(f)singleFimplicit(cax,f,limits,extraOpts,args) (line 148)
  In fimplicit>vectorizeFimplicit (line 148)
  In fimplicit (line 126) 
警告: 更新 ImplicitFunctionLine 时出错。

 动态结构体引用的参数的计算结果必须为有效字段名称。
 
警告: 更新 ImplicitFunctionLine 时出错。

 动态结构体引用的参数的计算结果必须为有效字段名称。

该回答引用ChatGPT
这个问题的报错信息中包含了两个警告和一个错误,分别是:
1. 警告:函数处理数组输入时行为异常。要改善性能,请将您的函数正确向量化,以返回大小和形状与输入参数相同的输出。
2. 警告:更新 ImplicitFunctionLine 时出错。动态结构体引用的参数的计算结果必须为有效字段名称。
3. 错误:更新 ImplicitFunctionLine 时出错。动态结构体引用的参数的计算结果必须为有效字段名称。
这些警告和错误的原因是代码中存在一些问题,下面我将逐一分析。
首先,第一个警告是因为函数 `f` 中的运算不支持数组输入,需要将其向量化。具体来说,可以使用 `.*` 和 `./` 代替 `*` 和 `/`,这样就可以支持数组输入了。修改后的 `f` 函数如下:
matlab
f = @(D,G,R) G.^2 + G.*(D+R-1)./(3.774*(R-1).*10^-3) + 0.3394*(D+R)./(R-1);

接下来,第二个和第三个警告是因为在调用 `fimplicit` 函数时,传入的函数句柄 `ff` 中的 `R` 变量被赋值为了标量 `0`,这导致 `ff` 函数的输出不再是一个函数句柄,而是一个标量值。因此,在 `fimplicit` 函数中使用 `ff` 时,就会出现上述警告和错误。
解决这个问题的方法是,将 `R` 变量从函数句柄中移除,而是在调用 `f` 函数时直接传入 `R` 的值。修改后的代码如下:
matlab
syms D G;
f = @(D,G,R) G.^2 + G.*(D+R-1)./(3.774*(R-1).*10^-3) + 0.3394*(D+R)./(R-1);
ff = @(D,G) f(D,G,0);
fimplicit(ff,[1 10 10^-6 10^7])

这样就可以成功画出隐函数图像了。

我引用ChatGPT作答:这个错误提示表明您的函数 f 处理数组输入时行为异常,这可能会影响性能。要改进性能,请将您的函数正确向量化,以返回与输入参数大小和形状相同的输出。

此外,还有两个警告提示您更新 ImplicitFunctionLine 时出错,可能是由于动态结构体引用的参数的计算结果不是有效的字段名称导致的。

可能的解决方案是使用点乘运算符 .* 和除法运算符 ./ 来实现逐元素运算,这样可以使您的函数处理向量化输入。例如,将 f 函数重新定义为:

f = @(D, G, R) G.^2 + G.*(D+R-1)./(3.774*(R-1)*10^-3) + 0.3394*(D+R)./(R-1);

此外,您定义的 ff 函数可以简化为:

ff = @(D, G) f(D, G, R);

其中 R 已经在上面定义为 0。

如果仍然出现错误,请检查 ImplicitFunctionLine 的输入参数是否正确,以及是否存在其他代码错误。

你的问题主要是第一个警告的错误:将您的函数正确向量化,以返回大小和形状与输入参数相同的输出
错误的原因是你的表达式f存在问题,存在表达式错误的问题。
解决方法是修改f表达式,对其中的各个值进行向量话,参考表达式的表示方式:

  f = @(x,y,z) x.^2.*y.^2+y.^2.*z.^2+z.^2.*x.^2-1

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/749479
  • 这篇博客也不错, 你可以看下MATLAB常见语法错误
  • 除此之外, 这篇博客: MATLAB画简单函数图形中的 MATLAB 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 新手入住,这学期新开了一门MATLAB课。平时上课就是看老师复制粘贴PPT出结果,真到自己写的时候就傻眼了。加上其他课程里也提到了MATLAB可以画图,建立仿真模型等功能,所以想课后学也一下。
    因为是新手,就当是记录下学习脚步吧。

该回答引用ChatGPT GPT-4

运行结果

img

代码

% 定义函数
f = @(D,G) G.^2 + G .* (D./(3.774 * 10^-3)) + 0.3394 * D;

% 设置D和G的范围
D_range = [0 10];
G_range = [0 10^4];

% 生成3D曲面图
figure;
fsurf(f, [D_range G_range]);
xlabel('D');
ylabel('G');
zlabel('f(D,G)');
title('3D Surface Plot');

% 生成2D等高线图
D_vals = linspace(D_range(1), D_range(2), 100);
G_vals = linspace(G_range(1), G_range(2), 100);
[D_grid, G_grid] = meshgrid(D_vals, G_vals);

f_vals = f(D_grid, G_grid);

figure;
contour(D_grid, G_grid, f_vals);
xlabel('D');
ylabel('G');
title('2D Contour Plot');


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是因为你在创建隐函数时,将R定义为符号变量,之后又将R赋值为0。这导致在f函数内,G.(D+R-1)和0相乘,在MATLAB中会报错。

解决方法是不要对R进行赋值,而是在创建隐函数时将它定义为实数变量。可以这样修改代码:

syms D G;
R = sym('R', 'real');
f = @(D,G,R) G.^2 + (G.(D+R-1)./(3.774(R-1).10^-3)) + (0.3394(D+R)./(R-1));
ff = @(D,G) f(D,G,0);
fimplicit(ff, [1 10 10^-6 10^7]);

这里将R定义为实数变量,ff函数只有两个输入参数D和G,而f函数则有三个输入参数D、G和R。通过将R定义为实数变量,可以避免输入0时与G相乘的问题。
如果我的回答解决了您的问题,请采纳!

直接用普通方法吧,F表示式直白地敲