MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 120|回复: 0|关注: 0

[未答复] 牛顿迭代法求非线性方程组的解的问题(带根号)

[复制链接]

新手

5 麦片

财富积分


050


1

主题

2

帖子

0

最佳答案
发表于 6 天前 | 显示全部楼层 |阅读模式
各位:

现在遇到一个问题,我写了个用牛顿法求解非线性方程组的解的matlab代码,我的这个方程组带了几个根号。
联系方式我的邮箱:lei.cai@ensam.eu


  1. function New_solution
  2. syms x y
  3. k1 = 15; k2 = 25; l1 = 30; l2 = 40; m = 70; g = 10; L =10; %定义常量
  4. f1 = k1*((x^2+y^2)^(0.5)-l1)*sin(atan(x/y))+k2*(((L-x)^2+y^2)^(0.5)-l2)*sin(atan((L-x)/y));% 方程1
  5. f2 = k1*((x^2+y^2)^(0.5)-l1)*cos(atan(x/y))+k2*(((L-x)^2+y^2)^(0.5)-l2)*cos(atan((L-x)/y))+m*g*y;%方程2
  6. F = [f1 f2];
  7. X0 = [1 1]'; %迭代初值
  8. k=1; %迭代累计
  9. dF = jacobian(F,[x,y]);% 对F分别求x , y的偏导数
  10. while(1)  
  11.     fprintf('The %d time iteration :\n', k);
  12.     dFX0 = subs(subs(dF,x,X0(1)),y,X0(2));%求dFX0的值
  13.     fprintf('dFX0 = \n');
  14.     fprintf('%d %d\n%d %d\n',dFX0);   
  15.     FX0 = subs(subs(F,x,X0(1)),y,X0(2));%求FX0的值
  16.     fprintf('FX0 = \n');
  17.     fprintf('%d %d\n',FX0);   
  18.     X1= X0 - dFX0^(-1)*FX0';%进行迭代计算 ,这是没有改进的牛顿法。
  19.     fprintf('X1 = \n');
  20.     fprintf('%d %d\n',X1);
  21.     if norm(X0-X1)<0.01  %精度判断      
  22.         break;
  23.     else
  24.         k=k+1;
  25.         X0 = X1;
  26.     end
  27. end

  28. fprintf('The reusult is %.4f\n', X1); %打印结果
  29. fprintf('Iteration time is %d\n', k); %打印迭代次数
  30. end

复制代码


但是我运行下,没法收敛,计算到第三次迭代就一直再计算。

我的问题是:
1.我的这个牛顿迭代的语法是否有问题(我对这个不也是特别熟悉,也是最近做一个题目刚学习的)?
2.是不是对于带根号的非线性方程,牛顿迭代计算效率很低?
3.可以给点建议。

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

本版积分规则

关闭

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

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