您的位置:首页 > 编程语言 > MATLAB

利用牛顿法接非线性方程组的Matlab程序实例

2016-03-28 10:34 483 查看
首先将线性方程组写成f(x)=0的形式,编写第一个Matlab函数

function f = fun()
% 求解:
% 3*x1-cos(x2*x3)-1/2 = 0
% x1^2-81*(x2+0.1)^2+sin(x3)+1.06 = 0
% exp(-x1*x2)+20*x3+(10*pi-3)/3 = 0
% 求解精度为0.00001

syms x1 x2 x3
f1 = 3*x1-cos(x2*x3)-1/2;
f2 = x1^2-81*(x2+0.1)^2+sin(x3)+1.06;
f3 = exp(-x1*x2)+20*x3+(10*pi-3)/3;
f = [f1 f2 f3];


然后是方程组的Jacobi矩阵,编写第二个Matlab函数

function df = dfun()

f = fun();
df = [diff(f,'x1'); diff(f, 'x2'); diff(f, 'x3')];
df = df';


然后求解方程组的程序

function x = newton(x0, eps, N)
% x0是初值,可以任取,不需要满足方程组
% 最后得到的解与初值选取有关
% eps为精度
% N最大迭代次数

for i = 1:N
f = eval(subs(fun(), {'x1', 'x2', 'x3'}, {x0(1), x0(2), x0(3)}));
df = eval(subs(dfun(), {'x1', 'x2', 'x3'}, {x0(1), x0(2), x0(3)}));
x = x0 - f/df;
if norm(x - x0) < eps
for j = 1:length(x)
fprintf('%.2f\t', x(j));
end
break;
end
x0 = x;
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: