[原创]常用数值算法Matlab源码(PDE见另贴)【更新完成】
?? ?数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿用作商业用途……
说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名必须与函数名相同,懂一点儿Matlab的朋友应该知道。每个程序的说明里面都附了测试例子
这些程序在Vista操作系统下,使用Matlab R2008b(7.7版本)编写
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=0.5e-6; end tic; k=0; while 1
x=x0-f(x0)./df(x0); k=k+1;
if abs(x-x0) < eps || k ==30 break; end x0=x; end t=toc;
if k == 30
disp('迭代次数太多。'); x=' ';
end
2、Newdon迭代法求解非线性方程组
function y=NewdonF(x)
%牛顿迭代法解非线性方程组的测试函数 %定义是必须定义为列向量 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=NewdonDF(x)
%牛顿迭代法解非线性方程组的测试函数的导数 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=0.5e-6; end tic; k=0; while 1
x=x0-inv(df(x0))*f(x0);%此处可采用其他方法避免求逆 k=k+1;
if norm(x-x0) < eps || k == 15 break; end x0=x; end
t=toc;
if k == 15
disp('迭代次数太多。'); x=' '; end
3、Lagrange插值法
提供两个程序,采用了不同的方法
function f=InterpLagrange(x,y,x0) %构造Lagrange插值多项式
%此函数中借助向量卷积来求Lagrange基函数,运算速度较快 %f=InterpLagrange(x,y,x0)
%f:插值多项式或者是插值多项式在x0处的值 %x:节点 %y:函数值 %x0:某一测试点 %
%调用格式:
%f=InterpLagrange(x,y) 返回插值多项式
%f=InterpLagrange(x,y,x0) 返回插值多项式在点x0处的值