matlab迭代法求某数平方根,Newton迭代法求解多元非线性方程组问题

第一个函数

function [r,n]=mulNewton(x0,funcMat,var,eps)  % x0为变量的起始值,funcMat是方程,var为方程的变量,eps控制精度

% 牛顿迭代法解非线性方程组

if nargin==0

x0 = [0,0,0,0,0,0];

funcMat=[sym('(cos(oz)*cos(oy)*(-25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp+123.75)^2+(sin(oz)*cos(oy)*(-25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-123.75)^2+(-sin(oy)*(-25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')...

sym('(cos(oz)*cos(oy)*(-96.59)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-25.882+xp-(-169.04))^2+(sin(oz)*cos(oy)*(-96.59)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*25.882+yp-45.29)^2+(-sin(oy)*(-96.59)+cos(oy)*sin(ox)*25.882+zp-100)^2-260^2')...

sym('(cos(oz)*cos(oy)*(-70.71)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-70.71+xp-(-45.29))^2+(sin(oz)*cos(oy)*(-70.71)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-70.71+yp-(-169.04))^2+(-sin(oy)*(-70.71)+cos(oy)*sin(ox)*-70.71+zp-100)^2-260^2')...

sym('(cos(oz)*cos(oy)*(70.71)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-70.71+xp-(45.29))^2+(sin(oz)*cos(oy)*(70.71)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-70.71+yp-(-169.04))^2+(-sin(oy)*(70.71)+cos(oy)*sin(ox)*-70.71+zp-100)^2-260^2')...

sym('(cos(oz)*cos(oy)*(96.59)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*-25.882+xp-(169.04))^2+(sin(oz)*cos(oy)*(96.59)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*-25.882+yp-(45.29))^2+(-sin(oy)*(96.59)+cos(oy)*sin(ox)*-25.882+zp-100)^2-260^2')...

sym('(cos(oz)*cos(oy)*(25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp-(123.75))^2+(sin(oz)*cos(oy)*(25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-(123.75))^2+(-sin(oy)*(25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')];

var=[sym('oz') sym('oy') sym('ox') sym('xp') sym('yp') sym('zp')];

eps=1.0e-4;

end

n_Var = size(var,2);%变量的个数

n_Func = size(funcMat,2);%函数的个数

n_X = size(x0,2);%变量的个数

if n_X ~= n_Var && n_X ~= n_Func

fprintf('Expression Error!\n');

exit(0); %退出程序

end

r=x0-myf(x0, funcMat, var)*pinv(dmyf(x0, funcMat, var));

n=0;

tol=1;

while tol>=eps

x0=r;

r=x0-myf(x0, funcMat, var)*pinv(dmyf(x0, funcMat, var));

tol=norm(r-x0);

n=n+1;

if(n>100000)

disp('迭代步数太多,方程可能不收敛');

return;%跳出程序

end

end

end % end mulNewton

第二个函数

function f=myf(x,funcMat, varMat)

% 输入参数x为数值,func为符号变量矩阵,var为符号变量矩阵中的变量

% 返回值为矩阵,内容为数值

n_X = size(x,2);%变量的个数

f_Val = zeros(1,n_X);

for i=1:n_X

tmp_Var = cell(1,n_X);

tmp_X = cell(1,n_X);

for j=1:n_X

tmp_Var{j} = varMat(1,j);

tmp_X{j} = x(1,j);

end

f_Val(i) = subs(funcMat(1, i), tmp_Var, tmp_X);%subs替换符号指令

end

f=f_Val;

end % end myf

第三个函数

function df_val=dmyf(x, funcMat, varMat)

% 返回值为矩阵,内容为数值

%df=[df1/x1, df1/x2;

%    df2/x1. df2/x2];

n_X = size(x,2);%变量的个数

df =cell(n_X, n_X);

for i=1:n_X

for j=1:n_X

df{i,j} = diff(funcMat(1, i), varMat(1, j));

end

end

df_val=zeros(n_X, n_X);

for i=1:n_X

for j=1:n_X

tmp_Var = cell(1,n_X);

tmp_X = cell(1,n_X);

for k=1:n_X

tmp_Var{k} = varMat(1,k);

tmp_X{k} = x(1,k);

end

df_val(i,j) = subs(df{i,j}, tmp_Var, tmp_X);

end

end

end % end dmyf

运行后会出现的错误:

>> mulNewton

错误使用 sym>convertExpression (line 1391)

Conversion to 'sym' returned the MuPAD error: Error: Invalid input. ')' is expected. [line 1, col 252]

出错 sym>convertChar (line 1302)

s = convertExpression(x);

出错 sym>convertCharWithOption (line 1285)

s = convertChar(x);

出错 sym>tomupad (line 999)

S = convertCharWithOption(x,a);

出错 sym (line 142)

S.s = tomupad(x,'');

出错 mulNewton (line 6)

funcMat=[sym('(cos(oz)*cos(oy)*(-25.882)+(cos(oz)*sin(oy)*sin(ox)-sin(ox)*cos(ox))*96.59+xp+123.75)^2+(sin(oz)*cos(oy)*(-25.882)+(sin(oz)*sin(oy)*sin(ox)+cos(oz)*cos(ox)*96.59+yp-123.75)^2+(-sin(oy)*(-25.882)+cos(oy)*sin(ox)*96.59+zp-100)^2-260^2')...

>> 麻烦各位帮忙看看,新手小白不太会改错改语法。。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值