用MATLAB编出牛顿迭代法的程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用MATLAB编出牛顿迭代法的程序相关的知识,希望对你有一定的参考价值。
Newton迭代法求 法f(x)=x^6-x-=0于[0,2]内的一个实根
用牛顿法求f(x)=exp(-xk/4)(2-xk)-1 =0在0,2]是根
很急啊,论文要用,实在不会呀。求大神
%输入xo为估计的迭代初值,e为规定的误差,N为最大迭代次数.
%输出x,y为最后迭代的两个近似根,k为迭代次数.
clc
format long;
disp('迭代次数 近似根')
k=0;
x1=0;
x2=x0;
while (abs(x2-x1))>e
x1=x2;
x2=x1-f(x1)./df(x1);
k=k+1;
if k>N
return;
end
%%%%%%记录并输出%%%%%%%%%
o1=sprintf('%3d',k);
o2=sprintf('%3.8f',x2);
OL=[o1,' ' o2];
disp(OL);
y(k)=x2;
end
%%%%画图%%%%%%%
i=1:k;
figure(2)
plot(i,y,'rD-')
grid on
xlabel('迭代次数')
ylabel('近似根')
title(['牛顿法求出的该方程的近似根 x^*=', num2str(x2,9)])
function y=f(x)
y=x^2/2-sin(x)-1;
function y=df(x)
y=x-cos(x); 参考技术A %求方程x^3-sinx-12x+1=0的根。
N =1000;
x0=0;
x1=x0^3-sin(x0)-12*x0+1;
E=1.0e-6;%f=x*x*x+4*x*x-10=0,f1为f=x*x*x+4*x*x-10的一阶导
k=1;
matlab 用句柄传入的函数如何应用diff函数对其求导数?或者有无替代方法把一个函数传进来并且求导。
我在编写一个通用的牛顿迭代法求根的函数LAB,我想把待求根的函数f1用句柄传入,之后对其求导数,然后再进行其他步骤(此处省略)。可是diff函数不能对句柄求导数该怎么办呢?请教各位大神!
或者有无其他不用句柄的方法能够将一个外部定义的函数传入我的牛顿迭代函数并且求导数。
我的f1函数:
f1.m
function f = f1(x)
f1 = x^3/3-x;
通用牛顿迭代函数:
Lab_4_2.m
function Lab_4_2(f)
f1 = sym(f) 。。。。。。。主要是想在这里把传进来的句柄进行一些操作然后用diff求导数,可是我失败了。
f2 = diff(f1);。。。。。。。请教各位如何操作?
可通过syms将函数句柄转换为符号函数
用diff求导后
再通过matlabFunction转换为函数句柄
f = @(x) x.^2 + 2.* x + 1 % 通过函数句柄建立匿名函数
syms x % 通过符号变量将匿名函数转换为符号函数
y = f(x)
g = matlabFunction(diff(y)) % 通过matlabFunction将符号函数转换为匿名函数 参考技术A 确实没有办法直接对函数句柄求导,除非用符号函数。
我的建议是,直接给牛顿法函数传入导函数的句柄。接口如下:
function Lab_4_2(f, df, x0)
% f: 原函数句柄,例如@sin
% df: 导函数句柄,例如@cos
% x0: 初始解,例如0.1
... 参考技术B 事实上不需要传递函数进去,只需要传递一个式子进去就行(不是function),然后在Newton函数里面syms x 正常求导,需要其导数值的时候调用eval函数就行。
以上是关于用MATLAB编出牛顿迭代法的程序的主要内容,如果未能解决你的问题,请参考以下文章