查看: 539|回复: 5|关注: 1

[已答复] 如何使得两个子函数共用变量?

[复制链接]

新手

25 麦片

财富积分


050


10

主题

27

帖子

0

最佳答案
发表于 2019-7-21 12:51:21 | 显示全部楼层 |阅读模式
本帖最后由 杨利伟1980 于 2019-7-21 12:53 编辑

本人准备用newton法求解六自由度并联机构的正解,在网上搜索了一番,照葫芦画瓢,编写了一个程序,目前下面这个程序是可以求解的,有一个问题:两个子函数myfun(x)和myJacobi(x) 里面都必须有并联机构的参数值(包含各铰链的坐标参数及各支杆的长度),否则就会报错,怎么能让两个子函数共用一套参数值呢?谢谢大神,代码如下:


  1. function  Newton()
  2. format long
  3. x0=[0;0;200;0;0;0];
  4. x1=x0-inv(myJacobi(x0))*myfun(x0);
  5. while norm(x1-x0)>1e-3
  6.     x0=x1;
  7.     x1=x0-inv(myJacobi(x0))*myfun(x0);
  8. end
  9. x1
  10. end

  11. function f=myfun(x)
  12. syms x1 x2 x3 a b g
  13. X=[x1;x2;x3];
  14. RX=[1 0 0;0 cos(a) -sin(a);0 sin(a) cos(a)];
  15. RY=[cos(b) 0 sin(b);0 1 0;-sin(b) 0 cos(b)];
  16. RZ=[cos(g) -sin(g) 0;sin(g) cos(g) 0; 0 0 1];
  17. R=RZ*RY*RX;
  18. B1P1=[  121          -140       0  120         -20         0;  %初始参数矩阵%B1、P1
  19.         120         140         0  120         20          0;
  20.         61.243557   173.92305   0  -42.679489  113.92304   0;
  21.         -181.24356  33.92305    0  -77.320511  93.923042   0;
  22.         -181.24356  -33.92305   0  -77.320511  -93.923042  0;
  23.         61.243557   -173.92305  0  -42.679489  -113.92304  0];
  24.        %%   xb       yb          zb   xp1          yp1      zp1
  25. l1=233.2381;
  26. l2=233.2381;
  27. l3=233.2381;
  28. l4=233.2381;
  29. l5=233.2381;
  30. l6=233.2381;
  31. f1=(norm(X+R*[B1P1(1,4);B1P1(1,5);B1P1(1,6)]-[B1P1(1,1);B1P1(1,2);B1P1(1,3)]))^2-l1^2;
  32. f2=(norm(X+R*[B1P1(2,4);B1P1(2,5);B1P1(2,6)]-[B1P1(2,1);B1P1(2,2);B1P1(2,3)]))^2-l2^2;
  33. f3=(norm(X+R*[B1P1(3,4);B1P1(3,5);B1P1(3,6)]-[B1P1(3,1);B1P1(3,2);B1P1(3,3)]))^2-l3^2;
  34. f4=(norm(X+R*[B1P1(4,4);B1P1(4,5);B1P1(4,6)]-[B1P1(4,1);B1P1(4,2);B1P1(4,3)]))^2-l4^2;
  35. f5=(norm(X+R*[B1P1(5,4);B1P1(5,5);B1P1(5,6)]-[B1P1(5,1);B1P1(5,2);B1P1(5,3)]))^2-l5^2;
  36. f6=(norm(X+R*[B1P1(6,4);B1P1(6,5);B1P1(6,6)]-[B1P1(6,1);B1P1(6,2);B1P1(6,3)]))^2-l6^2;
  37. f=[f1;f2;f3;f4;f5;f6];
  38. x1=x(1);
  39. x2=x(2);
  40. x3=x(3);
  41. a=x(4);
  42. b=x(5);
  43. g=x(6);
  44. f=eval(f);
  45. end

  46. function J=myJacobi(x)
  47. syms x1 x2 x3 a b g
  48. X=[x1;x2;x3];
  49. RX=[1 0 0;0 cos(a) -sin(a);0 sin(a) cos(a)];
  50. RY=[cos(b) 0 sin(b);0 1 0;-sin(b) 0 cos(b)];
  51. RZ=[cos(g) -sin(g) 0;sin(g) cos(g) 0; 0 0 1];
  52. R=RZ*RY*RX;
  53. B1P1=[  121          -140       0  120         -20         0;  %初始参数矩阵%B1、P1
  54.         120         140         0  120         20          0;
  55.         61.243557   173.92305   0  -42.679489  113.92304   0;
  56.         -181.24356  33.92305    0  -77.320511  93.923042   0;
  57.         -181.24356  -33.92305   0  -77.320511  -93.923042  0;
  58.         61.243557   -173.92305  0  -42.679489  -113.92304  0];
  59.        %%   xb       yb          zb   xp1          yp1      zp1
  60. l1=233.2381;
  61. l2=233.2381;
  62. l3=233.2381;
  63. l4=233.2381;
  64. l5=233.2381;
  65. l6=233.2381;
  66. f1=(norm(X+R*[B1P1(1,4);B1P1(1,5);B1P1(1,6)]-[B1P1(1,1);B1P1(1,2);B1P1(1,3)]))^2-l1^2;
  67. f2=(norm(X+R*[B1P1(2,4);B1P1(2,5);B1P1(2,6)]-[B1P1(2,1);B1P1(2,2);B1P1(2,3)]))^2-l2^2;
  68. f3=(norm(X+R*[B1P1(3,4);B1P1(3,5);B1P1(3,6)]-[B1P1(3,1);B1P1(3,2);B1P1(3,3)]))^2-l3^2;
  69. f4=(norm(X+R*[B1P1(4,4);B1P1(4,5);B1P1(4,6)]-[B1P1(4,1);B1P1(4,2);B1P1(4,3)]))^2-l4^2;
  70. f5=(norm(X+R*[B1P1(5,4);B1P1(5,5);B1P1(5,6)]-[B1P1(5,1);B1P1(5,2);B1P1(5,3)]))^2-l5^2;
  71. f6=(norm(X+R*[B1P1(6,4);B1P1(6,5);B1P1(6,6)]-[B1P1(6,1);B1P1(6,2);B1P1(6,3)]))^2-l6^2;
  72. f=[f1;f2;f3;f4;f5;f6];
  73. J=jacobian([f1 f2 f3 f4 f5 f6],[x1 x2 x3 a b g]);
  74. x1=x(1);
  75. x2=x(2);
  76. x3=x(3);
  77. a=x(4);
  78. b=x(5);
  79. g=x(6);
  80. J=eval(J);
  81. end

复制代码

新手

25 麦片

财富积分


050


10

主题

27

帖子

0

最佳答案
 楼主| 发表于 2019-7-21 12:56:13 | 显示全部楼层
两个子函数共用的参数代码如下:

  1. syms x1 x2 x3 a b g
  2. X=[x1;x2;x3];
  3. RX=[1 0 0;0 cos(a) -sin(a);0 sin(a) cos(a)];
  4. RY=[cos(b) 0 sin(b);0 1 0;-sin(b) 0 cos(b)];
  5. RZ=[cos(g) -sin(g) 0;sin(g) cos(g) 0; 0 0 1];
  6. R=RZ*RY*RX;
  7. B1P1=[  121          -140       0  120         -20         0;  %初始参数矩阵%B1、P1
  8.         120         140         0  120         20          0;
  9.         61.243557   173.92305   0  -42.679489  113.92304   0;
  10.         -181.24356  33.92305    0  -77.320511  93.923042   0;
  11.         -181.24356  -33.92305   0  -77.320511  -93.923042  0;
  12.         61.243557   -173.92305  0  -42.679489  -113.92304  0];
  13.        %%   xb       yb          zb   xp1          yp1      zp1
  14. l1=233.2381;
  15. l2=233.2381;
  16. l3=233.2381;
  17. l4=233.2381;
  18. l5=233.2381;
  19. l6=233.2381;
复制代码

论坛优秀回答者

中级

626 麦片

财富积分


5001500


0

主题

283

帖子

48

最佳答案
  • 关注者: 8
发表于 2019-7-22 15:08:27 | 显示全部楼层
可以用global 定义全局变量试试

新手

25 麦片

财富积分


050


10

主题

27

帖子

0

最佳答案
 楼主| 发表于 2019-7-27 20:15:05 | 显示全部楼层
没有用过全局变量,请问如何定义呢?

入门

68 麦片

财富积分


50500


0

主题

52

帖子

4

最佳答案
发表于 2019-7-29 22:30:21 | 显示全部楼层
可以用嵌套函数的形式来进行共享变量,不用传递参数,可以参考matlab25个高效编程技巧这本书

新手

25 麦片

财富积分


050


10

主题

27

帖子

0

最佳答案
 楼主| 发表于 2019-8-2 08:05:28 | 显示全部楼层
收到,谢谢。不过我倒是想到一个笨办法,将两个子函数共用的参数写入到一个txt文本当中,假定文本名字是data,txt,然后两个子函数都去读取这个文本,这样的话二者的参数就完全一致了,当我需要修改参数的时候,只要修改data,txt中的参数,二者的参数也就跟着修改了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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