szxmakabaka 2023-12-08 21:36 采纳率: 0%
浏览 31
已结题

MATLAB提示左侧和右侧的元素数目不同

利用牛顿下山法求解偏导等于0的式子,我自己把公式嫁接到网上找到的牛顿下山法代码中,但是MATLAB运行会提示“无法执行赋值,因为左侧和右侧的元素数目不同。”,左边是一个数字,右边也是一个数字,请问是哪里有问题呢


```c++
clear clc
d = [2000, 2000, 2000]; % 第i种运输方式的运输距离  
s = [75, 900, 250]; % 第i种运输方式的运输速度  
l = [0.02, 0, 0]; % 第i种运输方式的货损率  
u = [0.64, 3.23, 2.81]; % 第i种运输方式的单位运价率  
p = [0.7794, 0.8836, 0.985]; % 第i种运输方式的准点率
syms x 
m=-(1-l).*p;
q=d./s;
g=u.*d;
V=m.*(q.*x+g);
h=diff(sum(log(exp(V./min(V))./sum(exp(V./min(V))))),x);%代换函数
disp(h)
x0=NW(h,1,100);%100为迭代最大次数
function result=NW(h,x,n)
f=matlabFunction(h);
f1=matlabFunction(diff(h));
X(1)=x;
i=2;
r=1;%下山因子
while 1
    X(i)=X(i-1)-r*f(X(i-1))/f1(X(i-1));
    if abs(f(X(i))) <1e-5 %牛顿法流程
         result=X(i);
         return;
    end
    if abs(f(X(i)))<abs(f(X(i-1)))  %下山因子满足条件
        r=1;
    else    %下山因子不满足条件,减半
        r=r/2;
    end
    if i>n
        result=X(i);
        return;
    end
    i=i+1;
% disp(Alpha)
% disp(i)
end
end

```

  • 写回答

8条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-12-08 23:31
    关注

    所有内容均由人工智能模型输出,其内容的准确性和完整性无法保证,不代表我的态度或观点。
    (通义千问专栏,V2.1.0版本,2023.12.01)


    该回答引用通义千问大模型,仅提供参考,不保证完全正确
    你在使用牛顿法求解时,将 h 函数定义为符号函数。但在 NW 函数中,你尝试将其转换为数值函数并进行计算。在这个过程中可能出现了问题。


    我注意到你的代码在以下行可能会出现问题:

    f=matlabFunction(h);
    f1=matlabFunction(diff(h));
    

    这可能是由于 h 或其导数 diff(h) 是一个向量或矩阵,而 matlabFunction 需要一个标量作为输入。你需要确保 h 和 diff(h) 是标量。


    你可以尝试以下方法解决此问题:

    1. 确保 h 和 diff(h) 是标量,而不是向量或矩阵。
    2. 在调用 matlabFunction 之前,检查 h 和 diff(h) 的大小是否正确。
    3. 如果 h 或 diff(h) 是向量或矩阵,请考虑修改代码以适应这种情况。例如,如果你想要对每个元素分别应用牛顿法,可以考虑使用循环或者 arrayfun。

    希望这些信息对你有所帮助!如果还有其他问题,请随时告诉我。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月13日
  • 赞助了问题酬金15元 12月10日
  • 创建了问题 12月8日