Matlab 数值计算小示例。主要为牛顿迭代法、LU分解法、拉格朗日插值、牛顿插值法
2016-12-17 19:09
375 查看
本文源于一次课题作业,部分自己写的,部分借用了网上的demo
牛顿迭代法(1)x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);grid on;%由图像可知 根在1.05到1.15之间 syms x s0=diff(x^3-x^2+sin(x)-1,x,1); % 得到s0= cos(x) - 2*x + 3*x^2 % 迭代方程为 y=x-(x.^3-x.^2+sin(x)-1)/(cos(x) - 2.*x + 3*x.^2) clear; x=1.15; for i=1:30 x=x-(x.^3-x.^2+sin(x)-1)/(cos(x) - 2.*x + 3*x.^2)%根据牛顿迭代法公式。一直迭代计算30次。 end %可得 x取值为1.0935;
牛顿迭代法(2)
%% 绘制图形。判断跟的大概位置。 x=1:0.01:2; f=x.^3-x.^2+sin(x)-1; plot(x,f,'linewidth',2);grid on;%由图像可知 根在1.05到1.15之间 %% clc,clear syms x f=x.^3-x.^2+sin(x)-1;%所求函数 df=diff(f,x); %求取一阶导数 eps=1e-4; %误差判断 x0=1.15; %迭代初始值。 cnt=0; MAXCNT=20; %最大循环次数 while cnt<MAXCNT %防止无限循环 x1=x0-subs(f,x,x0)/subs(df,x,x0); %去掉这个分号,可以看到迭代过程. if (abs(x1-x0)<eps) break; end x0=x1; cnt=cnt+1; end if cnt==MAXCNT disp '不收敛' else vpa(x1,8) end
LU分解法
被调函数:
function [L,U]=lufj(A) % 利用紧凑格式法原理 编写的LU 分解 [n,m]=size(A); % 获取A矩阵的行和列 if m~=n %判断行列相等与否 error('Not a squared matrix1'); else A(2:n)=A(2:n)/A(1,1); for k=2:n-1 A(k,k:n)=A(k,k:n)-A(k,1:k-1)*A(1:k-1,k:n); A(k+1:n,k)=(A(k+1:n,k)-A(k+1:n,1:k-1)*A(1:k-1,k))/A(k,k); end %都是根据定义进行循环计算。 end L=A;U=A; for i=1:n L(i,i)=1; L(i,i+1:n)=0; U(i,1:i-1)=0; end
主函数:
%% 需要调用lufj函数; A=[-2 -2 3 5 1 2 1 -2 2 5 3 -2 1 3 2 3] b=[-1 4 7 0] % x=A\b %左除法求解 [L,U]=lufj(A); x0=L\b; x=U\x0%求出的x即为解
拉格朗日插值法
被调函数:
function y=lagrange(x0,y0,x); % 根据拉格朗日插值定义编写 n=length(x0);m=length(x); for i=1:m z=x(i); s=0.0;%给s的初值 for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end
主函数:
x=[0,1,2,4]; y=[1,9,23,3]; y0=lagrange(x,y,1.5)
牛顿插值
被调函数:
function yi=New_Int(x,y,xi) %Newton基本插值公式 %x为向量,全部的插值节点 %y为向量,差值节点处的函数值 %xi为标量,是自变量 %yi为xi出的函数估计值 n=length(x); m=length(y); if n~=m error('The lengths of X ang Y must be equal!'); return; end %计算均差表Y Y=zeros(n); Y(:,1)=y'; for k=1:n-1 for i=1:n-k if abs(x(i+k)-x(i))<eps error('the DATA is error!'); return; end Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i)); end end %计算牛顿插值公式 yi=0; for i=1:n z=1; for k=1:i-1 z=z*(xi-x(k)); end yi=yi+Y(1,i)*z; end
主函数:
clear all clc x0=[0.4 0.55 0.65 0.80 0.90 1.05]; y0=[0.41075 0.57815 0.69675 0.88811 1.0265 1.25382]; x1=0.596; % 待插值点。 y1=New_Int(x0,y0,x1)% y1即为待插值点的函数值。
TIP:主函数和被调函数要放在一个文件夹内。否则会引起调用错误
NOTE:本文对基本方法做了总结,你可以结合理论知识再来看代码,希望对你有所帮助
相关文章推荐
- Matlab 数值计算----牛顿迭代法
- 数值计算-线性方程组求解(1)-LU分解-MATLAB实现
- Matlab 数值计算泰勒公式
- 【书单】matlab 科学计算、数值分析以及数学物理问题
- MATLAB之数值计算
- MATLAB数值计算与数据分析(1)
- MATLAB入门教程 第四章 数值计算功能(协方差,特征值)
- matlab基础学习——数值计算
- Matlab 数值计算----二分法求非线性方程组
- MATLAB基础学习----数值的计算(1)
- MATLAB符号计算与数值计算 之转换
- Matlab 数值计算----迭代法计算非线性方程组在指定区间的根
- MATLAB 数值计算练习代码
- matlab学习笔记--数值计算
- Matlab 数值计算----斯特芬森加速迭代法
- MATLAB数值计算与数据分析(2)
- Matlab并行计算示例(一)
- c++中计算运行时间 clock() clock_t 示例:比较递归和非递归数值运算
- 牛顿插值法——用Python进行数值计算
- Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法