老哥们,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 时出错。
动态结构体引用的参数的计算结果必须为有效字段名称。
该回答引用ChatGPTmatlab
f = @(D,G,R) G.^2 + G.*(D+R-1)./(3.774*(R-1).*10^-3) + 0.3394*(D+R)./(R-1);
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
新手入住,这学期新开了一门MATLAB课。平时上课就是看老师复制粘贴PPT出结果,真到自己写的时候就傻眼了。加上其他课程里也提到了MATLAB可以画图,建立仿真模型等功能,所以想课后学也一下。
因为是新手,就当是记录下学习脚步吧。
该回答引用ChatGPT GPT-4
运行结果
代码
% 定义函数
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表示式直白地敲