楼主: mjjackey
3849 1

[问答] 用1stOpt解出非线性方程组的解作为初值用Matlab求解,解不出来 [推广有奖]

  • 0关注
  • 0粉丝

小学生

50%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
46 点
帖子
4
精华
0
在线时间
7 小时
注册时间
2015-2-28
最后登录
2020-1-25

楼主
mjjackey 发表于 2015-2-28 17:44:47 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

1stOpt解出非线性方程组的解作为初值用Matlab求解,解不出来

这是一个非线性方程组(Matlab表示):


  1. function  f= solveMagneticDipoleEquation(x)
  2. %UNTITLED Summary of this function goes here
  3. %   Detailed explanation goes here
  4. %已知数
  5. a=-150;
  6. b=150;
  7. Bx=-48030;
  8. By=29370;
  9. Bz=-19077.3;
  10. %未知数
  11. Bt=x(1);
  12. c=x(2);
  13. m=x(3);
  14. n=x(4);
  15. p=x(5);
  16. Rl=sqrt(a.^2+b.^2+c.^2);
  17. f(1)=Bt*(3*(m*a+n*b+p*c)*a/Rl.^5-m/Rl.^3)/Bx-1;
  18. f(2)=Bt*(3*(m*a+n*b+p*c)*b/Rl.^5-n/Rl.^3)/By-1;
  19. f(3)=Bt*(3*(m*a+n*b+p*c)*c/Rl.^5-p/Rl.^3)/Bz-1;
  20. f(4)=m.^2+n.^2+p.^2-1;
  21. end
复制代码

用一开始建模型的人给的粗略的初始值范围,用默认设置选项,解出的解明显不对,警告提示要用Levenberg-Marquardt算法,后改用这种算法options=optimset('Display','iter','Algorithm','Levenberg-Marquardt'); 结果还是一样。


于是使用1stOpt软件,网上只能下载到免安装的1.5版本,使用如下代码:


  1. Parameters Bt[10^10,10^12];
  2. Parameters c[160,200];
  3. Parameters m[-0.55,0.54];
  4. Parameters n[-0.52,0.54];
  5. Parameters p[0.65,1];
  6. Parameters Rl;
  7. Constant a=-150;
  8. Constant b=150;
  9. Constant Bx=-48030;  //Bx,By,Bz是变参数,从文件中读出一行再解一次方程,每次解出来的解存入放入数组,最后求出平均值
  10. Constant By=29370;
  11. Constant Bz=-19077.3;
  12. //BatchFileModel;
  13. //VarConstant Bx="Sheet1[A1:A240]";
  14. //VarConstant By="Sheet1[B1:B240]";
  15. //VarConstant Bz="Sheet1[C1:C240]";
  16. //DataFile "D:\Mag1230.xls[Sheet1[A1:A240]]";
  17. //RowDataSet;
  18.      //Bx="Sheet1[A1:A240]";
  19.      //By="Sheet1[B1:B240]";
  20.      //Bz="Sheet1[C1:C240]";
  21. //EndRowDataSet;
  22. Function Bt*(3*(m*a+n*b+p*c)*a/Rl^5-m/Rl^3)/Bx-1=0;
  23. Bt*(3*(m*a+n*b+p*c)*b/Rl^5-n/Rl^3)/By-1=0;
  24. Bt*(3*(m*a+n*b+p*c)*c/Rl^5-p/Rl^3)/Bz-1=0;
  25. m^2+n^2+p^2-1=0;
  26. Rl-sqrt(a^2+b^2+c^2)=0;
复制代码




结果为:

====== 结果 ======


迭代数: 148

计算用时(:::毫秒): 00:00:00:482

计算中止原因: 达到收敛判定标准

优化算法: 最大继承法

函数表达式 1: bt*(3*(m*(-150)+n*150+p*c)*(-150)/rl^5-m/rl^3)/(-48030)-1-(0)

         2: bt*(3*(m*(-150)+n*150+p*c)*150/rl^5-n/rl^3)/29370-1-(0)

         3: bt*(3*(m*(-150)+n*150+p*c)*c/rl^5-p/rl^3)/(-19077.3)-1-(0)

         4: m^2+n^2+p^2-1-(0)

         5: rl-sqrt((-150)^2+150^2+c^2)-(0)

目标函数值: 0

Bt: 999812590445.556

c: 161.888089867363

m: 0.401079546362512

n: -0.0464426102549249

p: 0.914865171182263

Rl: 266.847809885904


====== 计算结束 ======

当然每次运行结果都会有点不同,但大致都在这个范围内。


因为我要继续一步作分析,BxByBz是测试数据,要从表格中读出的,对应每一组数据求一次方程组,相当于变常量,按照上面注释中采用的两种方法,都没有达到我预期的效果,软件把它也当做变量去求解了,也有可能是用的方法不对,但我从手册中找不到其它方法了。因为Matlab编程方便,可以实现我的需求,于是我又转回Matlab,用1stOpt解出非线性方程组的解作为初值用Matlab求解,依然求不出解,除了算法的设置,误差和迭代次数的设置都是因为解不出正确的解,自己调的,但是依然没用。




  1. x0=[999999999999 161.9 0.401 -0.0465 0.9148 266.856];
  2. options=optimset('Display','iter','MaxFunEvals',10^5,'TolFun',1e-18,'TolX',1e-18,'MaxIter',1e4,'Algorithm','Levenberg-Marquardt');
  3. [x val]= fsolve(@solveMagneticDipoleEquation,x0,options);
复制代码
请问:如何用Matlab可以解出这个方程组的解?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:非线性方程组 MATLAB atlab 线性方程组 非线性方程 Matlab 非线性方程组

沙发
shamohu123 发表于 2015-11-23 23:04:25
只能说明Matlab的方程求解能力还很弱。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 19:00