查看: 450|回复: 14|关注: 0

[已解决] matlab句柄函数求导

[复制链接]

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
本帖最后由 jiangchangs123 于 2018-8-8 19:08 编辑
  1. <p>clc;clear</p><p>f = @(x) x.^2 + 2.* x + 1    % 通过函数句柄建立匿名函数</p><p>syms x                                  % 通过符号变量将匿名函数转换为符号函数</p><p>y = f(x)</p><p>g = matlabFunction(diff(y))   % 通过matlabFunction将符号函数转换为匿名函数</p>
复制代码


我在网上看到有人通过这种方法对句柄函数求导,于是乎我的模仿如下。。
  1. clear;clc;
  2. f=@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3) %%%%f为数值x中三个元素之和
  3. syms x t
  4. y=f(x)
  5. g = matlabFunction(diff(y))% 通过matlabFunction将符号函数转换为匿名函数
复制代码
错误提示:
索引超出矩阵维度。

出错 sym/subsref (line 881)
            R_tilde = builtin('subsref',L_tilde,Idx);

出错 diff_study_2>@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3)

出错 diff_study_2 (line 22)
y=f(x)

请问这个问题应该如何解决,我想通过matlab对句柄函数求导,麻烦路过的朋友帮忙看看能不能解决
想要得到的结果   =1+x(2)*x(3);1+x(1)*x(3);1+x(1)*x(2)

论坛优秀回答者

专家

2402 麦片

财富积分


20003000


1

主题

2661

帖子

541

最佳答案
  • 关注者: 94
发表于 2018-8-9 07:02:32 | 显示全部楼层 |此回复为最佳答案
本帖最后由 maple1314168 于 2018-8-9 07:05 编辑
  1. syms x1 x2 x3 t
  2. f=x1+x2+x3+t*x1*x2*x3;
  3. fun=matlabFunction(gradient(f,[x1 x2 x3]));
  4. fun=@(t,x)fun(t,x(1),x(2),x(3))
复制代码
人家的是一元的,你的是三元,所以出错。

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-9 21:21:29 | 显示全部楼层
maple1314168 发表于 2018-8-9 07:02
人家的是一元的,你的是三元,所以出错。

谢谢答主多次耐心解答

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-9 21:36:45 | 显示全部楼层
本帖最后由 jiangchangs123 于 2018-8-9 22:43 编辑
maple1314168 发表于 2018-8-9 07:02
人家的是一元的,你的是三元,所以出错。

谢谢答主解答,我研究了一下

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-9 22:37:50 | 显示全部楼层
本帖最后由 jiangchangs123 于 2018-8-9 22:50 编辑
maple1314168 发表于 2018-8-9 07:02
人家的是一元的,你的是三元,所以出错。

答主,您好,我想问一下,如果你这里的f本
  1. syms x1 x2 x3 t
  2. f=@(x)x(1)+x(2)+t*x(1)*x(2)*x(3)
  3. fun=matlabFunction(gradient(f(x),[x(1) x(2) x(3)]));
  4. fun=@(t,x)fun(t,x(1),x(2),x(3))
复制代码
身就是一个句柄函数的话,又应该怎么操作,我自己尝试了老半天都没有得到解决

我还是想得到上面的结果,但是我多次修改代码都没有能够实现3
做了如下尝试依然不行,麻烦答主有空的时候再解答一下,万分感谢
  1. clear;clc;
  2. syms x1 x2 x3 t;
  3. f=@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3)
  4. f=f(x1 x2 x2)%%这里我想把f转换为f=x1+x2+x3+t*x1*x2*x3然后重复上面的动作,发现不行
复制代码

论坛优秀回答者

专家

2402 麦片

财富积分


20003000


1

主题

2661

帖子

541

最佳答案
  • 关注者: 94
发表于 2018-8-10 00:01:54 | 显示全部楼层
jiangchangs123 发表于 2018-8-9 22:37
答主,您好,我想问一下,如果你这里的f本
身就是一个句柄函数的话,又应该怎么操作,我自己尝试了老半天 ...
  1. syms x1 x2 x3 t
  2. f=@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3);
  3. f=f([x1 x2 x3])
复制代码

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-10 10:44:28 | 显示全部楼层
  1. syms x1 x2 x3 t
  2. f=@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3);%
复制代码


请问答主,在这里能不能减少一个步骤,在这里,我能不能不通过将f转换为x1 x2 x3的函数,直接对数组x中x(1) x(2) x(3)求导,等到前面相同的结果

论坛优秀回答者

专家

2402 麦片

财富积分


20003000


1

主题

2661

帖子

541

最佳答案
  • 关注者: 94
发表于 2018-8-10 11:33:52 | 显示全部楼层
jiangchangs123 发表于 2018-8-10 10:44
请问答主,在这里能不能减少一个步骤,在这里,我能不能不通过将f转换为x1 x2 x3的函数,直接对数组x中x( ...

你把符号函数与数值函数混在一起了。
他们一般是需要转换的。matlab应该没有这样的命令。

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-10 13:55:16 | 显示全部楼层
maple1314168 发表于 2018-8-10 11:33
你把符号函数与数值函数混在一起了。
他们一般是需要转换的。matlab应该没有这样的命令。 ...

嗯嗯,谢谢你哈!!非常感谢你的解答

新手

36 麦片

财富积分


050


26

主题

100

帖子

0

最佳答案
 楼主| 发表于 2018-8-10 14:46:57 | 显示全部楼层
本帖最后由 jiangchangs123 于 2018-8-10 15:04 编辑
maple1314168 发表于 2018-8-10 11:33
你把符号函数与数值函数混在一起了。
他们一般是需要转换的。matlab应该没有这样的命令。 ...

我模仿您写了一个,但是一直报错,麻烦有空帮忙看看
  1. clear;clc;
  2. syms x1 x2 x3 x4 x5 x6 t
  3. t=2;
  4. z=@(x)x(1)+t*x(2)+x(3)*x(4)+x(5)*x(6);
  5. z=z([x1 x2 x3 x4 x5 x6]);
  6. fun=matlabFunction(gradient(z,[x1 x2 x3 x4 x5 x6]));
  7. fun=@(x)fun(x(1),x(2),x(3),x(4),x(5),x(6));
  8. x=[1;2;3;4;5;6];
  9. aa=fun(x)
复制代码
提示:
错误使用 symengine>@(x3,x4,x5,x6)[1.0;2.0;x4;x3;x6;x5]
输入参数太多。

出错 @(x)fun(x(1),x(2),x(3),x(4),x(5),x(6))


但是,下面这个就可以正常运行
  1. clear;clc;
  2. syms x1 x2 x3 t
  3. t=2;
  4. f=@(x)x(1)+x(2)+x(3)+t*x(1)*x(2)*x(3);
  5. f=f([x1 x2 x3]);
  6. fun=matlabFunction(gradient(f,[x1 x2 x3]));
  7. fun=@(x)fun(x(1),x(2),x(3));
  8. x=[1;2;3];
  9. aa=fun(x)
复制代码
不知道为什么
就我自己观察发现原因是在第一组代码中:gradient(f,[x1 x2 x3 x4 x5 x6])

ans =

  1
  2
x4
x3
x6
x5
  其求导结果中,其结果中对x1 x2求导结果不包含数组x中元素结果导致的,但是我不知道应该怎么修改代码,让程序正常运行

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

快速回复 返回顶部 返回列表