
定义函数
function y=nd(x)
y= 0036-((x/20907)^(1/01585))-x/182000
function y=nd0(x)
y=- (1/01585)(x/20907)^(1/01585-1)(1/20907) - 1/182000
主程序
x=05; %迭代初值
i=0; %迭代次数计数
while i<=100;
y=x-nd(x)/nd0(x); %牛顿迭代格式
if abs(y-x)>10^(-5); %收敛判断
x=y;
else break
end
i=i+1;
end
fprintf('\n%s%4f \t%s%d','x=',x,'i=',i) %输出结果
x=-1005000 i=101
首先,建立原函数的自定义函数文件
function y = fun(x)
y=x^4-3x^3+5cos(x)+8;
其次,建立导函数的自定义函数文件
function y = dfun(x)
y=4x^3-9x^2-5sin(x);
最后,用牛顿法求解
x0=1;tol=1e-6;x1=newton(x0,tol)
n =
5
x1 =
1787494463594194
验证:
x1 = 1787494463594194;x1^4-3x1^3+5cos(x1)+8
ans =
-3552713678800501e-015 (=0)
这样吧,你不要直接通过solve求解啊,可以画一个图像啊,以x的值为横坐标,行列式值为纵坐标,或者纵坐标取一下对数(如果变化范围太大),然后可以得出大致得到解的范围;最后可以通过其他方法计算更加精确的解。
希望能帮到你,我算程序就是这样实现的
% 用牛顿下山法求解方程
function [x,k]=myfun_newton(f,x0,emg)
% f表示非线形方程
% x0迭代初值,此种方法是局部收敛,初值要选择恰当
% emg是精度指标
% k,u分别表示迭代次数和下山因子
% d1表示非线形方程f在x0处的导数值
[f1,d1]=feval(f,x0);
k=1;
x(1)=x(0);
x(2)=x(1)-f1/d1;
while abs(f1)>emg
u=1;
k=k+1;
[f1,d1]=feval(f,x(k));
x(k+1)=x(k)-uf1/d1;
while abs(f2)>abs(f1)
u=u/2;
x(k+1)=x(k)-uf1/d1;
[f2,d2]=feval(f,x(k+1));
end
end
这个收敛速度快,建议给你用下
function s=NewtonIterate(x,eps)
%Newton迭代法求解非线性方程组的解
%x为迭代初值,eps为允许误差
if nargin==1
eps=10e-6;
elseif nargin<1
return
end
x1=fx1(x); %非线性方程组函数fx1m
x2=-dfx1(x); %非线性方程组的导数函数dfx1m
x0=x2\x1';
while norm(x0)>=eps
x=x0'+x;
x1=fx1(x);
x2=-dfx1(x);
x0=x2\x1';
end
s=x0'+x;
return
function y=fx1(x)%函数1
y=x^3-2x-5
function y=dfx1(x)%函数2
y=3x^2-2
%命令行
>> x= NewtonIterate(25,eps)
x =
1307/624
以上就是关于matlab 用牛顿法求解方程全部的内容,包括:matlab 用牛顿法求解方程、牛顿法求解 matlab实现、matlab中牛顿法编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)