1、Newdon迭代法求解非线性方程
function [x k t]=NewdonToEquation(f,df,x0,eps) %牛顿迭代法解线性方程
%[x k t]=NewdonToEquation(f,df,x0,eps) %x:近似解 %k:迭代次数 %t:运算时间
%f:原函数,定义为内联函数 ?:函数的倒数,定义为内联函数 %x0:初始值 %eps:误差限 %
%应用举例:
%f=inline('x^3+4*x^2-10'); ?=inline('3*x^2+8*x');
%x=NewdonToEquation(f,df,1,0.5e-6) %[x k]=NewdonToEquation(f,df,1,0.5e-6) %[x k t]=NewdonToEquation(f,df,1,0.5e-6)
%函数的最后一个参数也可以不写。默认情况下,eps=0.5e-6 %[x k t]=NewdonToEquation(f,df,1)
if nargin==3 eps=\end tic; k=0; while 1
x=\ k=\
if abs(x-x0) < eps || k >30 break; end x0=x; end t=toc;
if k >= 30
disp('迭代次数太多。'); x=\ t=\end
2、Newdon迭代法求解非线性方程组
function y=\
%牛顿迭代法解非线性方程组的测试函数 %定义是必须定义为列向量
y(1,1)=x(1).^2-10*x(1)+x(2).^2+8; y(2,1)=x(1).*x(2).^2+x(1)-10*x(2)+8; return;
function y=\
%牛顿迭代法解非线性方程组的测试函数的导数 y(1,1)=2*x(1)-10; y(1,2)=2*x(2); y(2,1)=x(2).^+1; y(2,2)=2*x(1).*x(2)-10; return;
以上两个函数仅供下面程序的测试
function [x k t]=NewdonToEquations(f,df,x0,eps) %牛顿迭代法解非线性方程组
%[x k t]=NewdonToEquations(f,df,x0,eps) %x:近似解 %k:迭代次数 %t:运算时间
%f:方程组(事先定义) ?:方程组的导数(事先定义) %x0:初始值 %eps:误差限 %
%说明:由于虚参f和df的类型都是函数,使用前需要事先在当前目录下采用函数M文件定义 % 另外在使用此函数求解非线性方程组时,需要在函数名前加符号“@”,如下所示 %
%应用举例:
%x0=[0,0];eps=0.5e-6;
%x=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %[x k]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %[x k t]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps) %函数的最后一个参数也可以不写。默认情况下,eps=0.5e-6
%[x k t]=NewdonToEquations(@NewdonF,@NewdonDF,x0,eps)
if nargin==3 eps=\end tic; k=0; while 1
x=\此处可采用其他方法避免求逆 k=\
if norm(x-x0) < eps || k > 15 break; end x0=x; end t=toc;
if k >= 15
disp('迭代次数太多。'); x=\ t=\end
3、Lagrange插值法
提供两个程序,采用了不同的方法
function f=\%构造Lagrange插值多项式
%此函数中借助向量卷积来求Lagrange基函数,运算速度较快 %f=InterpLagrange(x,y,x0)
%f:插值多项式或者是插值多项式在x0处的值 %x:节点 %y:函数值 %x0:某一测试点 %
%调用格式:
%f=InterpLagrange(x,y) 返回插值多项式
%f=InterpLagrange(x,y,x0) 返回插值多项式在点x0处的值 %举例:
%x=[0.32 0.34 0.36];y=[0.314567 0.333487 0.352274];x0=0.33;
%f=InterpLagrange(x,y) %f=InterpLagrange(x,y,x0)
if length(x)==length(y) n=\else
disp('节点个数和函数值个数不同!') f=' '; return; end p=0; for i=\ l=\ for j=\ if j==i continue; end
%利用卷积计算Lagrange基函数 l=conv(l,[1 -x(j)]./(x(i)-x(j))); end
%p是一向量,表示插值多项式的系数 p=\end
if nargin==3
f=\计算插值多项式在x0处的值 else
f=\把插值多项式的向量形式转化为插值多项式的符号形式 end
function f=\%构造Lagrange插值多项式
%此函数中借助符号运算来求Lagrange基函数,运算速度较慢,不推荐此种方法 %f=InterpLagrange2(x,y,x0)
%f:插值多项式或者是插值多项式在x0处的值 %x:节点 %y:函数值 %x0:某一测试点 %
%调用格式:
%f=InterpLagrange2(x,y) 返回插值多项式
%f=InterpLagrange2(x,y,x0) 返回插值多项式在点x0处的值 %举例:
%x=[0.32 0.34 0.36];y=[0.314567 0.333487 0.352274];x0=0.33; %f=InterpLagrange2(x,y) %f=InterpLagrange2(x,y,x0)
if length(x)==length(y) n=\else
disp('节点个数和函数值个数不同!') f=' '; return; end syms t; f=0; for i=\ l=\ for j=\ if j==i continue; end
l=l*(t-x(j))/(x(i)-x(j));%借助符号运算,计算Lagrange基函数 end
f=\
simplify(f);%化简多项式 if i==n
if nargin==3
f=\计算插值多项式f在点x0处的值 else
f=\计算插值多项式,展开并合并同类项 f=\设置多项式系数的有效数字 end end end
4、Newdon插值法