matlab实现数值计算功能源程序(个人整理)
Matlab中常用的数值计算方法
Matlab中常用的数值计算方法数值计算是现代科学和工程领域中的一个重要问题。
Matlab是一种用于数值计算和科学计算的高级编程语言和环境,具有强大的数值计算功能。
本文将介绍Matlab中常用的数值计算方法,包括数值积分、数值解微分方程、非线性方程求解和线性方程组求解等。
一、数值积分数值积分是通过数值方法来近似计算函数的定积分。
在Matlab中,常用的数值积分函数是'quad'和'quadl'。
'quad'函数可以用于计算定积分,而'quadl'函数可以用于计算无穷积分。
下面是一个使用'quad'函数计算定积分的例子。
假设我们想计算函数f(x) = x^2在区间[0, 1]上的定积分。
我们可以使用如下的Matlab代码:```f = @(x) x^2;integral = quad(f, 0, 1);disp(integral);```运行这段代码后,我们可以得到定积分的近似值,即1/3。
二、数值解微分方程微分方程是描述自然界各种变化规律的数学方程。
在科学研究和工程应用中,常常需要求解微分方程的数值解。
在Matlab中,可以使用'ode45'函数来求解常微分方程的数值解。
'ode45'函数是采用基于Runge-Kutta方法的一种数值解法。
下面是一个使用'ode45'函数求解常微分方程的例子。
假设我们想求解一阶常微分方程dy/dx = 2*x,初始条件为y(0) = 1。
我们可以使用如下的Matlab代码:```fun = @(x, y) 2*x;[x, y] = ode45(fun, [0, 1], 1);plot(x, y);```运行这段代码后,我们可以得到微分方程的数值解,并绘制其图像。
三、非线性方程求解非线性方程是指方程中包含非线性项的方程。
在很多实际问题中,我们需要求解非线性方程的根。
如何使用MATLAB进行数值计算
如何使用MATLAB进行数值计算使用MATLAB进行数值计算一、引言数值计算是现代科学与工程领域中不可或缺的一部分,它能够解决许多实际问题,包括求解方程、优化问题和模拟实验等。
而MATLAB作为一种功能强大的数值计算软件,被广泛应用于各个领域。
本文将介绍如何使用MATLAB进行数值计算,并结合实例进行说明。
二、MATLAB基础首先,我们需要了解MATLAB的基本操作和语法,以便能够熟练运用。
MATLAB使用矩阵和数组来存储和处理数据,因此,熟悉矩阵和数组操作是非常重要的。
MATLAB中的矩阵和数组是通过方括号来定义的,例如:A = [1 2 3; 4 5 6; 7 8 9]表示一个3x3的矩阵A,其中每个元素由空格或分号隔开。
我们可以使用括号或索引来访问矩阵中的元素。
例如,要访问矩阵A的第二行第三列的元素,可以使用A(2,3)。
MATLAB提供了大量内置的数学函数,包括算术运算、三角函数、指数和对数函数等。
这些函数可以直接应用于矩阵和数组,简化了数值计算的过程。
三、方程求解方程求解是数值计算中的一个重要任务,MATLAB提供了多种方法来求解方程,包括代数方法和数值方法。
1. 代数方法对于一些简单的方程,例如一元一次方程或二次方程,可以直接使用MATLAB内置的解方程函数进行求解。
例如,对于一元一次方程ax + b = 0,可以使用solve函数来求解。
代码示例:syms x;eqn = a*x + b == 0;sol = solve(eqn, x);其中,syms x;指定x为符号变量,eqn为方程表达式,sol为方程的解。
2. 数值方法对于一些复杂的方程,无法用解析方法求解。
这时,可以使用数值方法来近似求解。
MATLAB提供了多种数值求解方法,包括二分法、牛顿法和割线法等。
这些方法可以通过迭代逼近的方式求解方程的根。
代码示例:f = @(x) x^2 - 4;x0 = 2;x = fzero(f, x0);其中,f为方程的表达式,x0为初始猜测值,x为方程的根。
MATLAB数值计算功能
MATLAB数值计算功能下面将详细介绍MATLAB数值计算功能的一些主要方面:1. 矩阵运算和线性代数:MATLAB具有强大的矩阵操作功能,可以直接对矩阵进行加减乘除、求逆矩阵、求特征值等运算。
MATLAB中的线性方程组求解函数(如`linsolve`和`inv`)可以更轻松地解决各种线性代数问题。
2. 数值积分和微分:MATLAB提供了多种数值积分和微分函数,用于求解一元和多元函数的定积分、不定积分、数值微分和数值求导。
例如,可以使用`integral`函数计算函数的定积分,并使用`diff`函数计算函数的导数或`gradient`函数计算梯度。
3. 方程求解:MATLAB提供了一系列函数,用于解决非线性方程和代数方程组。
这些函数包括`fsolve`(用于求解非线性方程),`roots`(用于求解多项式方程的根)和`solve`(用于求解代数方程组)等。
4. 曲线拟合和数据拟合:MATLAB提供了多个函数用于曲线拟合和数据拟合,包括`polyfit`(多项式拟合),`lsqcurvefit`(非线性最小二乘曲线拟合),`interp1`(一维插值)和`griddata`(多维数据插值)等。
这些函数可以帮助用户找到数据之间的模式和关系。
5. 常微分方程(ODE)求解:MATLAB提供了用于求解常微分方程组(ODE)的函数,既可以用传统的数值方法求解,也可以用符号计算求解。
用户可以使用`ode45`、`ode23`或`ode15s`等函数来求解初值问题或边界值问题。
6. 线性最小二乘拟合:MATLAB中的`lsqnonlin`函数可以用于线性最小二乘问题的求解,包括曲线拟合、数据拟合、参数估计等。
用户可以使用该函数来找到使得拟合曲线和观测数据之间残差最小的参数。
7. 数值优化:MATLAB包含一系列优化函数,可以求解常规优化问题、无约束优化问题、约束优化问题等。
用户可以使用函数`fminsearch`、`fminunc`和`fmincon`等来找到函数的最小值或最大值。
在Matlab中实现数值计算与优化算法
在Matlab中实现数值计算与优化算法数值计算与优化算法在工程和科学领域中扮演着重要的角色。
而Matlab作为一种强大的数值计算和数据分析工具,提供了丰富的函数和工具箱,可以方便地实现各种数值计算和优化算法。
本文将介绍在Matlab中实现数值计算和优化算法的一些常用方法和技巧。
1. 数值计算基础在进行数值计算之前,首先需要了解一些数值计算的基本概念和方法。
Matlab 提供了丰富的数学函数,例如矩阵运算、符号计算等。
通过使用这些函数,我们可以进行矩阵运算、数值积分、微分、微分方程求解等操作。
2. 数值计算方法在实际的数值计算中,我们经常需要解决一些复杂的问题,例如求解非线性方程、最小化函数、解线性方程组等。
Matlab提供了多种数值计算方法,例如牛顿法、拟牛顿法、全局优化算法等。
这些方法可以帮助我们高效地解决各种数值计算问题。
3. 数值优化算法数值优化是指在给定约束条件下求解最优解的问题。
在实际应用中,数值优化算法经常被用于解决一些优化问题,例如最小二乘法、线性规划、非线性规划等。
Matlab提供了多个优化工具箱,例如Optimization Toolbox和Global Optimization Toolbox,可以帮助我们实现各种数值优化算法。
4. 遗传算法遗传算法是一种模拟自然选择和遗传机制的优化算法。
在遗传算法中,通过适应度评价、选择、交叉和变异等操作,逐步搜索解空间,最终找到最优解。
Matlab 提供了一个遗传算法优化工具箱,可以方便地实现遗传算法。
5. 粒子群优化算法粒子群优化算法是一种模拟鸟群觅食行为的优化算法。
在粒子群优化算法中,通过模拟粒子在解空间中的运动,寻找最优解。
Matlab提供了一个粒子群优化工具箱,可以方便地实现粒子群优化算法。
6. 约束优化算法约束优化是指在给定约束条件下求解最优解的问题。
在实际应用中,约束优化经常被用于解决一些复杂的问题,例如最小化函数、最大化函数、多目标优化等。
如何在MATLAB中进行数值计算
如何在MATLAB中进行数值计算在科学计算领域,MATLAB被广泛应用于数值计算,它提供了强大而简便的工具和函数,可以帮助科学家们进行复杂的数学计算和数据分析。
本文将介绍如何在MATLAB中进行数值计算,并探讨一些常用的技巧和技术。
MATLAB中的数值计算是通过矩阵和向量运算来实现的,因此熟悉矩阵运算和向量操作是使用MATLAB进行数值计算的关键。
首先,让我们来看看如何定义和操作矩阵和向量。
在MATLAB中,可以使用矩阵和向量来存储和操作多个数值。
矩阵是一个二维数组,而向量是一个一维数组。
通过使用方括号和逗号来定义矩阵和向量。
例如,以下是一个3x3的矩阵的定义:A = [1, 2, 3; 4, 5, 6; 7, 8, 9];可以通过使用A(i, j)的形式来访问矩阵中的元素,其中i和j分别表示行和列的索引。
例如,要访问第二行第三列的元素,可以使用A(2, 3)。
向量可以通过类似的方式定义,只需要使用一个维度。
例如,以下是一个包含5个元素的行向量的定义:v = [1, 2, 3, 4, 5];可以使用v(i)的形式来访问向量中的元素,其中i表示索引。
例如,要访问第四个元素,可以使用v(4)。
在进行数值计算时,通常需要进行一些基本的运算,如加法、减法、乘法和除法。
在MATLAB中,这些运算可以直接应用于矩阵和向量。
加法运算可以使用加号来实现。
例如,要将两个矩阵A和B相加,可以使用以下代码:C = A + B;减法运算可以使用减号来实现。
例如,要将矩阵A减去矩阵B,可以使用以下代码:D = A - B;乘法运算可以使用乘号来实现。
例如,要将矩阵A乘以矩阵B,可以使用以下代码:E = A * B;除法运算可以使用除号来实现。
例如,要将矩阵A除以矩阵B,可以使用以下代码:F = A / B;除了基本的运算,MATLAB还提供了很多其他的函数和工具箱,可以帮助进行更复杂的数值计算和数据分析。
例如,MATLAB提供了一些常用的数学函数,如幂函数、指数函数、对数函数、三角函数等等。
MATLAB数值计算教程
MATLAB数值计算教程第一章:MATLAB入门1.1 MATLAB简介MATLAB(Matrix Laboratory)是一款强大的数值计算软件,广泛用于工程、科学和金融领域。
它的特点是简单易用、高效快速,并且拥有丰富的工具箱和函数库。
1.2 MATLAB环境搭建要使用MATLAB进行数值计算,首先需要安装MATLAB软件,并进行必要的配置。
通过官方网站下载安装程序,根据提示进行安装即可。
安装完成后,打开MATLAB环境,即可开始使用。
1.3 MATLAB基本操作在MATLAB环境中,可以通过命令行窗口输入和执行命令,也可以使用脚本文件进行批量处理。
常用的基本操作包括变量赋值、算术运算、函数调用等。
例如,使用"="符号赋值变量,使用"+"、"-"、"*"、"/"等符号进行算术运算。
第二章:向量和矩阵操作2.1 向量操作在MATLAB中,向量是一种特殊的矩阵,可以通过一组有序的元素构成。
向量可以进行基本的算术运算,如加法、减法、乘法、除法,还可以进行向量的点积、叉积等操作。
可以使用内置函数和运算符来实现。
2.2 矩阵操作矩阵是MATLAB中最常用的数据结构之一,使用矩阵可以进行多个向量的组合和运算。
可以进行矩阵的加法、减法、乘法、除法等操作,也可以进行矩阵的转置、求逆、求特征值等操作。
MATLAB提供了大量的函数和工具箱来支持矩阵的操作。
第三章:数值计算方法3.1 数值积分数值积分是一种用数值方法计算定积分的方法。
在MATLAB 中,可以使用内置函数来进行数值积分,如trapz函数和quad函数。
也可以使用Simpson法则、复合辛普森法等方法实现数值积分。
3.2 数值微分数值微分是一种用数值方法计算导数的方法。
在MATLAB中,可以使用内置函数进行数值微分,如diff函数和gradient函数。
如何在MATLAB中进行数值计算
如何在MATLAB中进行数值计算1.基本数学操作:-加法、减法、乘法、除法:使用+、-、*、/操作符进行基本算术运算。
-幂运算:使用^或.^(点乘)操作符进行幂运算。
- 开平方/立方:可以使用sqrt(或power(函数进行开平方和立方运算。
2.矩阵操作:- 创建矩阵:可以使用矩阵构造函数如zeros(、ones(、rand(等创建矩阵。
- 矩阵运算:使用*操作符进行矩阵相乘,使用transpose(函数进行矩阵转置。
- 矩阵求逆和求解线性方程组:使用inv(函数求矩阵的逆,使用\操作符求解线性方程组。
3.数值积分和微分:- 数值积分:使用integral(函数进行数值积分。
可以指定积分函数、积分上下限和积分方法。
- 数值微分:使用diff(函数进行数值微分。
可以指定微分函数和微分变量。
4.解方程:- 一元方程:使用solve(函数可以解一元方程。
该函数会尝试找到方程的精确解。
- 非线性方程组:使用fsolve(函数可以求解非线性方程组。
需要提供初始值来开始求解过程。
-数值方法:可以使用牛顿法、二分法等数学方法来求解方程。
可以自定义函数来实现这些方法。
5.统计分析:- 统计函数:MATLAB提供了丰富的统计分析函数,如mean(、std(、var(等用于计算均值、标准差、方差等统计量。
- 直方图和密度估计:使用histogram(函数可以绘制直方图,并使用ksdensity(函数进行核密度估计。
- 假设检验:使用ttest(或anova(函数可以进行假设检验,用于比较多组数据之间的差异。
6.数值优化:- 非线性最小化:使用fminunc(函数可以进行非线性最小化。
需要提供目标函数和初始点。
- 线性规划:使用linprog(函数可以进行线性规划。
需要提供目标函数和限制条件。
- 整数规划:使用intlinprog(函数可以进行整数规划。
需要提供目标函数和整数约束。
7.拟合曲线:- 线性拟合:使用polyfit(函数进行线性拟合。
(完整word版)用MATLAB实现计算器程序源代码(word文档良心出品)
function varargout = caculator(varargin)gui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @caculator_OpeningFcn, ...'gui_OutputFcn', @caculator_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});endfunction caculator_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject;set(handles.edit1,'string','0');set(handles.edit5,'string','0');guidata(hObject, handles);function varargout = caculator_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output;function edit1_Callback(hObject, eventdata, handles)function edit1_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit2_Callback(hObject, eventdata, handles)function edit2_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction edit3_Callback(hObject, eventdata, handles)function edit3_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction pushbutton1_Callback(hObject, eventdata, handles)handles.num1=strcat(get(handles.edit1,'string'),'+');set(handles.edit1,'string',handles.num1);guidata(hObject,handles);function pushbutton2_Callback(hObject, eventdata, handles) handles.num2=strcat(get(handles.edit1,'string'),'-');set(handles.edit1,'string',handles.num2);guidata(hObject,handles);function pushbutton3_Callback(hObject, eventdata, handles) handles.num3=strcat(get(handles.edit1,'string'),'*');set(handles.edit1,'string',handles.num3);guidata(hObject,handles);function pushbutton4_Callback(hObject, eventdata, handles) handles.num4=strcat(get(handles.edit1,'string'),'/');set(handles.edit1,'string',handles.num4);guidata(hObject,handles);function pushbutton_1_Callback(hObject, eventdata, handles) handles.shu1=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu1=strcat(handles.yuanshu,handles.shu1);if length(handles.shu1)<2;elseif (length(handles.shu1)>=2)&&(handles.shu1(end-1)==')')&& (handles.shu1(1)=='l')temp=handles.shu1(end);handles.shu1(end)=handles.shu1(end-1);handles.shu1(end-1)=temp;endset(handles.edit1,'string',handles.shu1);guidata(hObject, handles);function pushbutton_2_Callback(hObject, eventdata, handles) handles.shu2=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu2=strcat(handles.yuanshu,handles.shu2);if length(handles.shu2)<2;elseif (length(handles.shu2)>=2)&&(handles.shu2(end-1)==')')&& (handles.shu2(1)=='l')temp=handles.shu2(end);handles.shu2(end)=handles.shu2(end-1);handles.shu2(end-1)=temp;endset(handles.edit1,'string',handles.shu2);guidata(hObject, handles);function pushbutton_4_Callback(hObject, eventdata, handles) handles.shu4=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu4=strcat(handles.yuanshu,handles.shu4);if length(handles.shu4)<2;elseif (length(handles.shu4)>=2)&&(handles.shu4(end-1)==')')&& (handles.shu4(1)=='l')temp=handles.shu4(end);handles.shu4(end)=handles.shu4(end-1);handles.shu4(end-1)=temp;endset(handles.edit1,'string',handles.shu4);guidata(hObject, handles);function pushbutton_3_Callback(hObject, eventdata, handles) handles.shu3=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu3=strcat(handles.yuanshu,handles.shu3);if length(handles.shu3)<2;elseif (length(handles.shu3)>=2)&&(handles.shu3(end-1)==')')&& (handles.shu3(1)=='l')temp=handles.shu3(end);handles.shu3(end)=handles.shu3(end-1);handles.shu3(end-1)=temp;endset(handles.edit1,'string',handles.shu3);guidata(hObject, handles);function pushbutton_5_Callback(hObject, eventdata, handles) handles.shu5=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu5=strcat(handles.yuanshu,handles.shu5);if length(handles.shu5)<2;elseif (length(handles.shu5)>=2)&&(handles.shu5(end-1)==')')&& (handles.shu5(1)=='l')temp=handles.shu5(end);handles.shu5(end)=handles.shu5(end-1);handles.shu5(end-1)=temp;endset(handles.edit1,'string',handles.shu5);guidata(hObject, handles);function pushbutton_9_Callback(hObject, eventdata, handles) handles.shu9=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu9=strcat(handles.yuanshu,handles.shu9);if length(handles.shu9)<2;elseif (length(handles.shu9)>=2)&&(handles.shu9(end-1)==')')&& (handles.shu9(1)=='l')temp=handles.shu9(end);handles.shu9(end)=handles.shu9(end-1);handles.shu9(end-1)=temp;endset(handles.edit1,'string',handles.shu9);guidata(hObject, handles);function pushbutton_7_Callback(hObject, eventdata, handles) handles.shu7=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu7=strcat(handles.yuanshu,handles.shu7);if length(handles.shu7)<2;elseif (length(handles.shu7)>=2)&&(handles.shu7(end-1)==')')&& (handles.shu7(1)=='l')temp=handles.shu7(end);handles.shu7(end)=handles.shu7(end-1);handles.shu7(end-1)=temp;endset(handles.edit1,'string',handles.shu7);guidata(hObject, handles);function pushbutton_8_Callback(hObject, eventdata, handles) handles.shu8=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu8=strcat(handles.yuanshu,handles.shu8);if length(handles.shu8)<2;elseif (length(handles.shu8)>=2)&&(handles.shu8(end-1)==')')&& (handles.shu8(1)=='l')temp=handles.shu8(end);handles.shu8(end)=handles.shu8(end-1);handles.shu8(end-1)=temp;endset(handles.edit1,'string',handles.shu8);guidata(hObject, handles);function pushbutton_6_Callback(hObject, eventdata, handles) handles.shu6=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu6=strcat(handles.yuanshu,handles.shu6);if length(handles.shu6)<2;elseif (length(handles.shu6)>=2)&&(handles.shu6(end-1)==')')&& (handles.shu6(1)=='l')temp=handles.shu6(end);handles.shu6(end)=handles.shu6(end-1);handles.shu6(end-1)=temp;endset(handles.edit1,'string',handles.shu6);guidata(hObject, handles);function pushbutton18_Callback(hObject, eventdata, handles) handles.jieguo=get(handles.edit1,'string');handles.jieguo=strcat('=',handles.jieguo);eval(['handles.result''1' handles.jieguo]);set(handles.edit5,'string',num2str(handles.result1));guidata(hObject,handles);function pushbutton_0_Callback(hObject, eventdata, handles) handles.shu0=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');if handles.yuanshu(end)=='N';handles.yuanshu(end)='';endif handles.yuanshu(1)=='0';handles.yuanshu=handles.yuanshu(2:end);endhandles.shu0=strcat(handles.yuanshu,handles.shu0);if length(handles.shu0)<2;elseif (length(handles.shu0)>=2)&&(handles.shu0(end-1)==')')&& (handles.shu0(1)=='l')temp=handles.shu0(end);handles.shu0(end)=handles.shu0(end-1);handles.shu0(end-1)=temp;endset(handles.edit1,'string',handles.shu0);guidata(hObject, handles);function pushbutton20_Callback(hObject, eventdata, handles) handles.shu10=get(hObject,'string');handles.yuanshu=get(handles.edit1,'string');handles.shu10=strcat(handles.yuanshu,handles.shu10);set(handles.edit1,'string',handles.shu10);guidata(hObject, handles);function pushbutton21_Callback(hObject, eventdata, handles) function edit5_Callback(hObject, eventdata, handles)function edit5_CreateFcn(hObject, eventdata, handles)if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');endfunction pushbutton22_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.fanhao=strcat('-(',handles.yuanshu,')');set(handles.edit1,'string',handles.fanhao);guidata(hObject, handles);function pushbutton23_Callback(hObject, eventdata, handles)set(handles.edit1,'string','0');set(handles.edit5,'string','0');guidata(hObject, handles);function pushbutton24_Callback(hObject, eventdata, handles)result=questdlg('ÕæµÄÒªÍ˳ö£¿','Í˳öÈ·ÈÏ','È·¶¨','È¡Ïû','È¡Ïû'); if result=='È·¶¨', close(gcf); endfunction pushbutton25_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.sin=strcat('sin(',handles.yuanshu,')');set(handles.edit1,'string',handles.sin);guidata(hObject, handles);function pushbutton26_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.cos=strcat('cos(',handles.yuanshu,')');set(handles.edit1,'string',handles.cos);guidata(hObject, handles);function pushbutton27_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.tan=strcat('tan(',handles.yuanshu,')');set(handles.edit1,'string',handles.tan);guidata(hObject, handles);function pushbutton28_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.ln=strcat('reallog(',handles.yuanshu,')');set(handles.edit1,'string',handles.ln);guidata(hObject, handles);function pushbutton29_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.log=strcat('log',handles.yuanshu,'()');set(handles.edit1,'string',handles.log);guidata(hObject, handles);function pushbutton30_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.daoshu=strcat('1/(',handles.yuanshu,')');set(handles.edit1,'string',handles.daoshu);guidata(hObject, handles);function pushbutton31_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.sqrt=strcat('sqrt(',handles.yuanshu,')');set(handles.edit1,'string',handles.sqrt);guidata(hObject, handles);function pushbutton32_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.pingfang=strcat('(',handles.yuanshu,')^2');set(handles.edit1,'string',handles.pingfang);guidata(hObject, handles);function pushbutton33_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.ncifang=strcat('(',handles.yuanshu,')^N');set(handles.edit1,'string',handles.ncifang);guidata(hObject, handles);function pushbutton35_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.kuohao=strcat('(',handles.yuanshu,')');set(handles.edit1,'string',handles.kuohao);guidata(hObject, handles);function pushbutton36_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.yuanshu=handles.yuanshu(1:(end-1));if length(handles.yuanshu)<1handles.yuanshu='0';endset(handles.edit1,'string',handles.yuanshu);guidata(hObject, handles);% --- Executes on button press in pushbutton37.function pushbutton37_Callback(hObject, eventdata, handles) handles.yuanshu=get(handles.edit1,'string');handles.exp=strcat('exp(',handles.yuanshu,')');set(handles.edit1,'string',handles.exp);guidata(hObject, handles);% --- Executes when user attempts to close figure1.function figure1_CloseRequestFcn(hObject, eventdata, handles)% hObject handle to figure1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)% Hint: delete(hObject) closes the figuredelete(hObject);%--------------------------------------------------------------------function Untitled_14_Callback(hObject, eventdata, handles)% hObject handle to Untitled_14 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_15_Callback(hObject, eventdata, handles)set(gcf,'color','red')% hObject handle to Untitled_15 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_16_Callback(hObject, eventdata, handles)set(gcf,'color','blue')% hObject handle to Untitled_16 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_17_Callback(hObject, eventdata, handles)set(gcf,'color','green')% hObject handle to Untitled_17 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_18_Callback(hObject, eventdata, handles)set(gcf,'color','black')% hObject handle to Untitled_18 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_19_Callback(hObject, eventdata, handles)set(gcf,'color','yellow')% hObject handle to Untitled_19 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)%--------------------------------------------------------------------function Untitled_20_Callback(hObject, eventdata, handles)set(gcf,'color','m')% hObject handle to Untitled_20 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) function Untitled_1_Callback(hObject, eventdata, handles)function Untitled_2_Callback(hObject, eventdata, handles)function Untitled_3_Callback(hObject, eventdata, handles)function Untitled_4_Callback(hObject, eventdata, handles)function Untitled_4_CreateFcn(hObject, eventdata, handles)function Untitled_5_Callback(hObject, eventdata, handles)function Untitled_6_Callback(hObject, eventdata, handles)。
数值计算实例MATLAB实现(附带详细源码)
数值计算实例MATLAB实现附带详细源码1.在化学反应中,A 的一个分子和 B 的一个分子结合形成物质 C 的分子。
若在时刻t 时,物质 C 的浓度为() y t ,则其是下述初值问题的解()()() ,00y k a y b y y '=--=其中k 为正常数,a 和 b 分别表示 A 和 B 的初始浓度。
假设k = 0.01, a =70毫摩/升, b = 50 毫摩/升. 该方程的真解为0.20.2350(1)()75t te y t e---=- (1)自己编写程序,使用四阶经典Runge-Kutta (龙格-库塔法),以步长为0.5h =,在区间[0, 20]上给出() y t 的近似解; (2)列表给出真解和近似解的比较;(3)讨论当t →∞时,近似解的变化趋势,并分析该数值结果。
解:数学原理:四阶经典Runge-Kutta (龙格-库塔法)112341213243(22)6(,)(,)22(,)22(,)m m m m m m m m m m hu u k k k k k f t u h hk f t u k h hk f t u k k f t h u hk +=++++==++=++=++程序设计见附录 结果如下表:(3)近似解变化趋势当t→∞时,由以下极限方程可知:0.20.2350(1)()75lim()tttey tey t--→∞⎧-=-⎪⎨⎪⎩随着t→∞,近似值越来越接近真实值,极限的真实值为50,lim()50ty t→∞=,变化趋势也可由一下曲线图表示:感想:四阶Runge-Kutta法计算的结果精度非常好,其结果与真实解误差不大。
2.考虑定义在闭区间[−5, 5]上的函数()2112()5f x x -=+ ;(1)利用等距节点构造次数分别为 n = 4,8,16, 32 的插值多项式()n p x ,并分别画()()()()481632,,,p x p x p x p x ;(2)利用chebyshev 零点构造次数分别为 n = 4,8,16, 32 的插值多项式()n pp x()()()()481632,,,pp x pp x pp x pp x ;(3)画出当 n = 32 时,两种插值多项式的比较图,误差图,并给出相应的误差估计;(4)在这个问题中能观察到龙格现象吗? 解:数学原理:拉格朗日插值多项式:001122()()()()()n n n L x l x y l x y l x y l x y =+++011011()()()()(),0,1,2,()()()()k k n k k k k k k k n x x x x x x x x l x k n x x x x x x x x -+-+----==----0()()()nn n in k k k k k j k jj kx x L x l x y y x x ===≠-==-∑∑∏程序设计见附录(1) 利用等距节点构造次数分别为 n = 4,8,16, 32 的插值多项式如下: ()43240.00160.00.0640.60061400p x x x x x ++=++()876542830.00280.00640.02500.02500.00640.00260.000168.001p x x x x x x x x x ++++++=++()1615141312161110987654320.00210.00280.00410.0064 60.01120.02500.09290.09290.02050 0.01120.00640.00410.002.00160180.021.000p x x x x x x x x x x x x x x x x x ++++++++++++++=++()3231302928272632252423222120191817160001600018000210002400028000340004100050006400083001120016100250004350092902906029p x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .x x .=+++++++++++++++++151413121110987654320600929004350025000161001120008300064000500041000340002800024000210001800016x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .+++++++++++++++(2)利用chebyshev 零点构造次数分别为 n = 4,8,16, 32 的插值多项式如下:()43240.00160.00320.00320.0016x x p x x p x =++++()87654328+0.00190.00320.01080.01080.00320.00196=0.0.0106001pp x x x x x x x x x +++++++()161514131211109168765432=0.0016 0.0017 0.0019 0.00230.00320.00520.01080.0403 1.00000.04030.01080.00520.00320.00230.0019 0.0017 0.0016 pp x x x x x x x x x x x x x x x x x ++++++++++++++++()323130292827263225242322212019181700016000160001700017000190002100023000270003200040000520007100108001860040301428pp x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .x x =+++++++++++++++++16151413121110987654320142800403001860010800071000520004000320002700023000210001900017000170001600016.x .x .x .x .x .x .x .x .x .x .x .x .x .x .x .+++++++++++++++++(3)两种插值多项式的比较误差图如下(a)等距插值误差 (b) chebyshev零点插值误差(4) 等距插值在高次插值中能观察到龙格现象,而chebyshev零点插值观察不到龙格现象。
matlab数值计算代码
matlab数值计算代码Matlab是一种强大的数值计算软件,广泛应用于科学研究、工程设计等领域。
在Matlab中,我们可以使用代码来进行各种数值计算,包括数值积分、数值求解方程、数值解微分方程等。
本文将介绍一些常见的数值计算代码,并说明其原理和应用。
一、数值积分数值积分是利用数值方法求解定积分的过程。
在Matlab中,我们可以使用simpson函数或trapz函数进行数值积分计算。
这两个函数分别采用辛普森公式和梯形公式进行数值积分近似。
例如,下面的代码使用simpson函数计算函数f(x)在区间[a,b]上的定积分:```matlaba = 0;b = 1;n = 100;x = linspace(a, b, n);y = f(x);integral = simpson(y, x);```其中,a和b分别是积分区间的上下限,n是划分区间的个数,x是划分后的区间点,y是函数在各个区间点处的函数值,integral是计算得到的定积分值。
二、数值求解方程数值求解方程是指利用数值方法求解方程的近似解。
在Matlab中,我们可以使用fzero函数或fsolve函数进行数值求解方程。
这两个函数采用不同的求解算法,可以用于求解单变量方程或多变量方程。
例如,下面的代码使用fzero函数求解方程f(x)=0:```matlabx0 = 0;x = fzero(@f, x0);```其中,x0是求解初始值,@f是函数句柄,表示要求解的方程。
x 是求解得到的近似解。
三、数值解微分方程数值解微分方程是指利用数值方法求解微分方程的近似解。
在Matlab中,我们可以使用ode45函数或ode23函数进行数值解微分方程。
这两个函数采用不同的数值方法,可以用于求解常微分方程或偏微分方程。
例如,下面的代码使用ode45函数求解常微分方程dy/dx=f(x,y):```matlabx0 = 0;y0 = 1;xspan = [0, 1];[t, y] = ode45(@f, xspan, y0);```其中,x0和y0分别是初始条件,xspan是求解区间,@f是函数句柄,表示要求解的微分方程。
MATLAB数值计算入门教程
MATLAB数值计算入门教程第一章:MATLAB基础知识1.1 MATLAB简介MATLAB是一种用于解决科学与工程问题的高级技术计算环境。
它结合了数值分析、可视化和编程,提供了强大而灵活的工具来处理各种计算任务。
本章将介绍MATLAB的基本操作和界面。
1.2 MATLAB的安装和配置首先,我们需要下载和安装MATLAB软件。
在安装过程中,可以选择安装附带的工具箱,如统计工具箱和优化工具箱,以扩展MATLAB的功能。
安装完成后,还需进行基本配置,如设置工作目录和界面外观。
1.3 MATLAB的基本语法MATLAB使用面向向量和矩阵的语言,具有简洁而强大的语法。
本节将介绍MATLAB的基本数据类型、运算符、控制结构等。
例如,MATLAB中的向量和矩阵可以通过简单的行列运算实现。
第二章:MATLAB数值计算2.1 常用数值计算函数MATLAB提供了许多常用的数值计算函数,如求解线性方程组、插值、数值积分和微分等。
本章将介绍这些函数的使用方法,并给出实例演示。
2.2 数值计算方法数值计算方法是解决数值计算问题的核心。
本节将介绍常用的数值计算方法,如迭代法、数值求解微分方程和数值优化等。
同时,我们还会介绍MATLAB中对应的函数和工具箱。
第三章:MATLAB数据可视化3.1 绘图函数数据可视化是MATLAB的一个重要功能。
MATLAB提供了丰富的绘图函数,可以绘制二维曲线、三维曲面、散点图等。
本节将介绍这些绘图函数的使用方法,并给出实例演示。
3.2 图形操作与修改除了绘制基本图形外,MATLAB还提供了对图形进行操作与修改的函数。
例如,我们可以修改坐标轴范围、添加图例和标签,以便更好地展示和解读数据。
本节将详细介绍这些图形操作的方法。
第四章:MATLAB编程与应用4.1 MATLAB脚本和函数编写MATLAB不仅是一个交互式环境,还可以编写脚本和函数来实现更复杂的计算任务。
本节将介绍MATLAB脚本和函数的编写方法,并给出实例演示。
利用MATLAB进行数值计算与数值方法分析
利用MATLAB进行数值计算与数值方法分析一、引言数值计算是一种通过数值方法来解决实际问题的方法,它在科学工程领域中得到广泛的应用。
而MATLAB作为一种强大的数值计算工具,在数值计算和数值方法的分析中扮演着重要的角色。
本文将讨论利用MATLAB进行数值计算与数值方法分析的一些基本原理与实践方法。
二、MATLAB的基本特点MATLAB是一种高级的计算机语言和环境,具有以下几个基本特点:1.丰富的数学函数库:MATLAB内置了大量的数值分析和数学运算函数,可以方便地进行各种数值计算和数学运算。
2.灵活的矩阵操作:MATLAB以矩阵作为基本的数据类型,可以进行矩阵的各种运算和操作,方便处理线性方程组和矩阵运算等问题。
3.强大的绘图功能:MATLAB具有强大的绘图功能,可以制作各种二维和三维的图形,方便进行数据的可视化分析。
4.友好的交互式界面:MATLAB提供了友好的交互式界面,用户可以方便地输入和执行各种命令,实时查看结果。
三、数值计算与数值方法分析数值计算是利用计算机进行数值运算和数学计算的过程,通常将实际问题转化为数学模型,然后利用数值方法求解这些模型。
数值方法是一种通过数值计算来近似解决实际问题的方法,常用的数值方法包括数值逼近、数值积分、差分法、数值解微分方程等。
在实际应用中,我们通常会遇到各种实际问题,如求解非线性方程、求解线性方程组、数值积分、数值微分、函数逼近、曲线拟合、数据插值等。
对于这些问题,我们可以利用MATLAB提供的数值计算工具和数值方法进行分析和求解。
四、数值计算的基本步骤进行数值计算通常需要经过以下几个基本步骤:1.问题建模:将实际问题转化为数学模型,并定义相应的变量、参数和初始条件。
2.选择数值方法:根据问题的特点和要求,选择适当的数值方法进行求解,如牛顿法、二分法、高斯消去法、龙格-库塔法等。
3.编程实现:利用MATLAB编写程序实现所选择的数值方法,将问题具体化为计算机可以理解的指令。
如何在MATLAB中进行数值计算
如何在MATLAB中进行数值计算MATLAB是一种用于数值计算和科学计算的程序设计语言和环境。
它提供了各种函数和工具箱,用于处理数值计算问题,包括线性代数、数值积分、数值微分、常微分方程求解、优化、插值等。
下面将介绍如何在MATLAB中进行数值计算的基本步骤和常用函数。
首先,启动MATLAB软件,创建一个新的脚本文件(.m文件),用于编写和保存MATLAB代码。
1.数值计算基础在MATLAB中进行数值计算的基本单位是矩阵和向量。
可以使用MATLAB提供的各种函数来创建和操作矩阵和向量。
例如,可以使用"zeros"函数创建一个全零的矩阵,使用"ones"函数创建一个全一的矩阵,使用"rand"函数生成一个随机矩阵。
2.线性代数计算MATLAB提供了丰富的线性代数函数,用于处理线性方程组、矩阵运算和特征值计算等问题。
例如,可以使用"inv"函数计算矩阵的逆,使用"det"函数计算矩阵的行列式,使用"eig"函数计算矩阵的特征值和特征向量。
3.数值积分MATLAB提供了多种数值积分方法,用于计算函数的定积分。
可以使用"quad"函数进行一维数值积分,使用"quad2d"函数进行二维数值积分,使用"quad3d"函数进行三维数值积分。
4.数值微分MATLAB提供了多种数值微分方法,用于计算函数的导数和偏导数。
可以使用"diff"函数计算函数的导数,使用"gradient"函数计算函数的梯度,使用"hessian"函数计算函数的Hessian矩阵。
5.常微分方程求解MATLAB提供了多种数值方法,用于求解常微分方程组。
可以使用"ode45"函数求解一阶常微分方程,使用"ode15s"函数求解刚性常微分方程。
数值计算方法matlab程序
数值计算方法matlab程序嘿,朋友们!今天咱就来聊聊数值计算方法和那厉害的 Matlab 程序呀!你说数值计算方法像不像一个神奇的魔法盒子呀,里面装满了各种奇妙的技巧和算法。
它能帮我们解决好多好多复杂的数学问题呢!不管是求解方程,还是处理数据,它都能大显身手。
而 Matlab 程序呢,就像是这个魔法盒子的钥匙!有了它,我们就能轻松地打开这个盒子,尽情地利用里面的宝贝。
你想想看呀,当我们面对那些让人头疼的数学式子,自己手动去算得算到啥时候呀。
但有了 Matlab,那可就不一样啦!它能快速又准确地给出结果,就像有个超级聪明的小助手在帮我们干活。
比如说,我们要算一个很复杂的函数的积分。
要是自己去慢慢算,可能头发都要掉光啦!可 Matlab 呢,几下子就给我们搞定了,这多厉害呀!它还能绘制各种漂亮的图形呢!我们可以用它把那些抽象的数据变成直观的图像,一下子就能看出数据的规律和特点。
这就好比把一堆乱麻整理得清清楚楚,明明白白。
而且呀,Matlab 学起来也不难哦!只要我们用心去学,多练习练习,很快就能掌握它的基本用法啦。
到时候呀,我们就可以像个小魔法师一样,轻松地运用数值计算方法和 Matlab 程序解决各种难题。
咱再说说它的实用性吧。
在很多领域,比如工程、科学研究、金融等等,都离不开数值计算方法和 Matlab 呀。
工程师们用它来设计新产品,科学家们用它来分析实验数据,金融分析师们用它来预测市场趋势。
这可不是一般的厉害呀!你难道不想拥有这样一个强大的工具吗?让它帮你在学习和工作中更加得心应手。
总之呢,数值计算方法和 Matlab 程序就像是一对好搭档,它们能让我们的数学之旅变得轻松又有趣。
别再犹豫啦,赶紧去探索这个神奇的世界吧!相信你一定会爱上它们的!怎么样,还不赶紧去试试?。
MATLAB数值计算实践指南
MATLAB数值计算实践指南第一章:MATLAB数值计算基础MATLAB是一种强大的数值计算软件,广泛应用于科学、工程、经济、金融等领域。
本章将介绍MATLAB数值计算的基础知识,包括MATLAB的安装与启动、变量的定义与操作、矩阵与数组的运算等。
第一节:MATLAB的安装与启动要使用MATLAB进行数值计算,首先需要将其安装在计算机上。
MATLAB的安装非常简单,只需要按照安装向导的提示进行操作即可。
安装完成后,双击桌面上的MATLAB图标即可启动MATLAB。
第二节:变量的定义与操作在MATLAB中,可以通过赋值操作为变量赋值,并进行各种操作。
赋值操作使用等号进行,例如:x = 5。
可以使用变量进行数值计算,如:y = x^2。
MATLAB支持基本的数学运算,包括加减乘除、指数和对数运算等。
第三节:矩阵与数组的运算MATLAB中的矩阵与数组是进行数值计算的重要数据结构。
可以使用方括号来定义矩阵,例如:A = [1 2; 3 4]。
可以对矩阵进行各种运算,包括加减乘除、转置、求逆等。
还可以使用特殊的函数来创建矩阵,如:zeros、ones、eye等。
第二章:MATLAB数值计算函数本章将介绍MATLAB中常用的数值计算函数,包括数值积分、数值微分、方程求解、线性代数运算等。
第一节:数值积分MATLAB提供了多种数值积分函数,用于对函数进行数值积分。
常用的数值积分函数包括:trapz、quad等。
这些函数可以对一维函数和二维函数进行数值积分,可以指定积分区间和积分精度。
第二节:数值微分MATLAB提供了多种数值微分函数,用于对函数进行数值微分。
常用的数值微分函数包括:diff、gradient等。
这些函数可以对一维函数和二维函数进行数值微分,可以指定微分点和微分精度。
第三节:方程求解MATLAB提供了多种方程求解函数,用于求解线性方程组、非线性方程和常微分方程等。
常用的方程求解函数包括:solve、fsolve、ode45等。
第6讲MATLAB的数值计算
第6讲MATLAB的数值计算MATLAB(Matrix Laboratory)是一种使用高级编程语言和环境的数值计算软件。
它的设计初衷是为了简化科学和工程的数值计算过程,提供了许多功能强大的工具和函数,可以用于解决各种数学问题。
在本讲中,我们将介绍MATLAB的数值计算功能以及如何使用它进行数据分析和数值模拟。
首先,MATLAB提供了丰富的数学函数,可以用于计算各种数学运算,如基本的加减乘除、三角函数、指数函数等。
这些函数可以直接调用,无需编写复杂的程序来实现。
例如,计算一个数的平方可以使用`sqrt(`函数,计算两个数的和可以使用`sum(`函数,计算一个矩阵的逆可以使用`inv(`函数。
此外,MATLAB还提供了一些特殊的数学函数,如贝塞尔函数、Gamma函数等,可以用于更复杂的数学计算。
其次,MATLAB提供了强大的矩阵和向量计算功能。
在MATLAB中,矩阵和向量是一种基本的数据类型,可以进行各种矩阵运算。
MATLAB提供了许多矩阵运算的函数,如矩阵乘法`*`、矩阵加法`+`、矩阵转置`'`等。
此外,MATLAB还提供了一些专门用于矩阵和向量计算的函数,如求矩阵的行列式`det(`、求矩阵的特征值`eig(`、求矩阵的秩`rank(`等。
这些函数可以帮助我们进行复杂的矩阵运算,如矩阵的特征分解、矩阵的奇异值分解等。
再次,MATLAB提供了丰富的数据分析和统计工具。
在MATLAB中,我们可以使用各种函数来对数据进行处理和分析。
例如,我们可以使用`mean(`函数来计算数据的平均值,使用`std(`函数来计算数据的标准差,使用`histogram(`函数来绘制数据的直方图等。
此外,MATLAB还提供了一些专门用于数据分析和统计的工具箱,如统计工具箱、数据拟合工具箱等。
这些工具箱提供了许多高级的数据分析方法和算法,可以帮助我们进行更深入的数据分析。
最后,MATLAB还可以用于数值模拟和求解各种数学模型。
数值计算方法matlab程序
数值计算⽅法matlab程序function [x0,k]=bisect1(fun1,a,b,ep)if nargin<4ep=1e-5;endfa=feval(fun1,a);fb=feval(fun1,b);if fa*fb>0x0=[fa,fb];k=0;return;endk=1;while abs(b-a)/2>epx=(a+b)/2;fx=feval(fun1,x);if fx*fa<0b=x;fb=fx;elsea=x;fa=fx;k=k+1;endendx0=(a+b)/2;>> fun1=inline('x^3-x-1');>> [x0,k]=bisect1(fun1,1.3,1.4,1e-4)x0 =1.3247k =7>>N=500;endif nargin<3ep=1e-5;endx=x0;x0=x+2*ep;while abs(x-x0)>ep & kx0=x;x=feval(fun1,x0);k=k+1;endx0=x;if k==Nwarning('已达最⼤迭代次数')end>> fun1=inline('(x+1)^(1/3)');>> [x0,k]=iterate1(fun1,1.5)x0 =1.3247k =7>> fun1=inline('x^3-1');>> [x0,k]=iterate1(fun1,1.5)x0 =Infk =9>>Steffesen加速迭代(简单迭代法的加速)function [x0,k]=steffesen1(fun1,x0,ep,N) if nargin<4N=500;endx=x0;x0=x+2*ep;k=0;while abs(x-x0)>ep & kx0=x;y=feval(fun1,x0);z=feval(fun1,y);x=x0-(y-x0)^2/(z-2*y+x0);k=k+1;endx0=x;if k==Nwarning('已达最⼤迭代次数')end>> fun1=inline('(x+1)^(1/3)');>> [x0,k]=steffesen1(fun1,1.5)x0 =1.3247k =3>> fun1=inline('x^3-1');>> [x0,k]=steffesen1(fun1,1.5)x0 =1.3247k =6Newton迭代function [x0,k]=Newton7(fname,dfname,x0,ep,N) if nargin<5N=500;endendx=x0;x0=x+2*ep;k=0;while abs(x-x0)>ep & kx0=x;x=x0-feval(fname,x0)/feval(dfname,x0);k=k+1;endx0=x;if k==Nwarning('已达最⼤迭代次数')end>> fname=inline('x-cos(x)');>> dfname=inline('1+sin(x)');>> [x0,k]=Newton7(fname,dfname,pi/4,1e-8) x0 =0.7391k =4⾮线性⽅程求根的Matlab函数调⽤举例:1.求多项式的根:求f(x)=x^3-x-1=0的根:>> roots([1 0 -1 -1])ans =1.3247-0.6624 + 0.5623i-0.6624 - 0.5623i2.求⼀般函数的根>> fun=inline('x*sin(x^2-x-1)','x')fun =Inline function:fun(x) = x*sin(x^2-x-1)>> fplot(fun,[-2 0.1]);grid on-1.5956>> x=fzero(fun,[-1 -0.1])x =-0.6180[x,f,h]=fsolve(fun,-1.6)x =-1.5956f =1.4909e-009h =1(h>0表⽰收敛,h<0表⽰发散,h=0表⽰已达到设定的计算函数值的最⼤次数)第三章:线性⽅程组的数值解法1. ⾼斯消元法function [A,x]=gauss3(A,b)%本算法⽤顺序⾼斯消元法求解线性⽅程组n=length(b);A=[A,b];for k=1:n-1A((k+1):n,(k+1):(n+1))=A((k+1):n,(k+1):(n+1))-A((k+1):n,k)/A(k,k)*A(k,(k+1):(n+1)); A((k+1):n,k)=zeros(n-k,1);A;endx=zeros(n,1);%上⾯为消元过程x(n)=A(n,n+1)/A(n,n);for k=n-1:-1:1x(k)=(A(k,n+1)-A(k,(k+1):n)*x((k+1:n)))/A(k,k);end%上⾯为回代过程>> A=[2 3 4;3 5 2;4 3 30];>> b=[6,5,32]'b =>> [A,x]=gauss3(A,b)A =2.00003.00004.0000 6.00000 0.5000 -4.0000 -4.00000 0 -2.0000 -4.0000x =-1382列选主元的⾼斯消元法:function [A,x]=gauss5(A,b)%本算法⽤列选主元的⾼斯消元法求解线性⽅程组n=length(b);A=[A,b];for k=1:n-1%选主元[ap,p]=max(abs(A(k:n,k)));p=p+k-1;if p>kt=A(k,:);A(k,:)=A(p,:);A(p,:)=t;end%消元A((k+1):n,(k+1):(n+1))=A((k+1):n,(k+1):(n+1))-A((k+1):n,k)/A(k,k)*A(k,(k+1):(n+1)); A((k+1):n,k)=zeros(n-k,1);end%回代x=zeros(n,1);x(n)=A(n,n+1)/A(n,n);>> A=[2 3 4;3 5 2;4 3 30]; b=[6,5,32]';>> [A,x]=gauss5(A,b)A =4.0000 3.0000 30.0000 32.00000 2.7500 -20.5000 -19.00000 0 0.1818 0.3636x =-1382三⾓分解法:Doolittle 分解function [L,U]=doolittle1(A)n=length(A);U=zeros(n);L=eye(n);U(1,:)=A(1,:);L(2:n,1)=A(2:n,1)/U(1,1);for k=2:nU(k,k:n)=A(k,k:n)-L(k,1:k-1)*U(1:k-1,k:n);L(k+1:n,k)=A(k+1:n,k)-L(k+1:n,1:k-1)*U(1:k-1,n)/U(k,k); End y=zeros(n,1);x=y;y(1)=b(1);for i=2:ny(i)=b(i)-L(i,1:i-1)*y(1:i-1);endx(n)=y(n)/U(n,n);for i=n-1:-1:1x(i)=(y(i)-U(i,i+1:n)*x(i+1:n))/U(i,i);end>> A=[1 2 3;2 5 2 ;3 1 5];b=[14 18 20]';>> [L,U,x]=doolittle1(A,b)3 -8 1U =1 2 30 1 -40 0 -36x =2.83331.33332.8333平⽅根法:function [L,x]=choesky3(A,b)n=length(A);L=zeros(n);L(:,1)=A(:,1)/sqrt(A(1,1));for k=2:nL(k,k)=A(k,k)-L(k,1:k-1)*L(k,1:k-1)';L(k,k)=sqrt(L(k,k));for i=k+1:nL(i,k)=(A(i,k)-L(i,1:k-1)*L(k,1:k-1)')/L(k,k); endendy=zeros(n,1);x=y;y(1)=b(1)/L(1,1);for i=2:ny(i)=(b(i)-L(i,1:i-1)*y(1:i-1))/L(i,i);endx(n)=y(n)/L(n,n);for i=n-1:-1:1x(i)=(y(i)-L(i+1:n,i)'*x(i+1:n))/L(i,i);end>> A=[4 -1 1;-1 4.25 2.75;1 2.75 3.5]-1.0000 4.2500 2.75001.00002.75003.5000>> b=[4 6 7.25]'b =4.00006.00007.2500[L,x]=choesky3(A,b)L =2.0000 0 0-0.5000 2.0000 00.5000 1.5000 1.0000x =111>>迭代法求⽅程组的解Jacobi迭代法:function [x,k]=jacobi2(a,b,x0,ep,N)%本算法⽤Jacobi迭代求解ax=b,⽤分量形式n=length(b); k=0;if nargin<5N=500;endif nargin<4ep=1e-5;endif nargin<3x0=zeros(n,1);y=zeros(n,1);while norm(x-x0,inf)>ep & kk=k+1;x0=x;for i=1:ny(i)=b(i);for j=1:nif j~=iy(i)=y(i)-a(i,j)*x0(j);endendif abs(a(i,i))<1e-10|k==Nwarning('a(i,i) is too small');returnendy(i)=y(i)/a(i,i);endx=y;enda=[4 3 0;3 4 -1; 0 -1 4];b=[24 30 -24]';[x,k]=jacobi2(a,b)x =3.00004.0000-5.0000k =59Gauss-seidel迭代法:function [x,k]=gaussseide2(a,b,x0,ep,N)%本算法⽤Gauss-seidel迭代求解ax=b,⽤分量形式n=length(b); k=0;if nargin<5N=500;endendif nargin<3x0=zeros(n,1);y=zeros(n,1);endx=x0;x0=x+2*ep;while norm(x-x0,inf)>ep & kk=k+1;x0=x;y=x;for i=1:nz(i)=b(i);for j=1:nif j~=iz(i)=z(i)-a(i,j)*x(j);endendif abs(a(i,i))<1e-10|k==Nwarning('a(i,i) is too small');returnendz(i)=z(i)/a(i,i);x(i)=z(i);endend[x,k]=gaussseide2(a,b)x =3.00004.0000-5.0000k =25最速下降法function [x,k]=zuisuxiajiang(A,b,x0,ep,N)N=500;endif nargin<4ep=1e-8;endif nargin<3x0=ones(n,1);endx=x0;x0=x+2*ep;r=b-A*x;d=r;k=0;while norm(x-x0,inf)>ep & kk=k+1;x0=x;lamda=(d'*d)/(d'*A*d);x=x0+lamda*d;r=b-A*x;d=r;endif k==Nwarning('已达最⼤迭代次数')end共轭梯度算法function [x,k]=gongertidufa(A,b,x0,ep,N) %本算法⽤共轭梯度算法求解正定⽅程组Ax=b,,n=length(b);if nargin<5N=500;endif nargin<4ep=1e-8;x0=x+2*ep;r=b-A*x;d=r;k=0;while norm(x-x0,inf)>ep & kx0=x;lamda=(r'*r)/(d'*A*d);r1=r;x=x0+lamda*d;r=b-A*x;beta=(r'*r)/(r1'*r1);d=r+beta*d;endif k==Nwarning('已达最⼤迭代次数') end常微分⽅程数值解function [x,y]=Euler1(fun,xspan,y0,h)%本算法⽤欧拉格式计算微分⽅程y'=f(x,y)的解。
简单的以MATLAB作数值计算
简单的以MATLAB作数值计算内容结构M函数的编写;微分方程的数值解;积分的数值计算;插值与拟合, 神经网络.一. M函数的编写M函数文件的格式有严格的规定,它必须以“function”开头,比较简单的格式为:function输出变量=函数名称(输入变量)语句;例单击指令窗口工具栏的按钮,进入MA TLAB的程序编辑器窗口后,输入:function y=egfun(c,t)y=c(1)*exp(c(2)*t);保存以后(命名为egfun),在指令窗口输入:clear;egfun([22],2)%函数可以传递参数结果为:ans =109.1963又输入:syms t u v %令t,u,v为符号变量egfun([u,v],t)%函数可以传递参数结果为:ans =u*exp(v*t)任意M文件中的第1个函数称为主函数.主函数可以有任意多个子函数,它们可以作为主函数的子函数.大多数情况下,主函数是M文件中可以从MA TLAB命令或从另一个M文件函数调用的唯一函数.调用该函数时,使用定义该函数的M文件的名称.例average 函数在文件average.m中.function y =average(x) % 计算矢量元素的平均值 y =sum(x)/length(x);可以从MA TLAB 命令行用下面的命令计算3个数的平均值average([2 5 2])注意:一般使主函数的名称与M 文件的相同.如果函数名与文件名不同,必须用文件名调用函数.总结函数式M 文件比较标准的格式为:function <因变量>=<函数名>(<自变量>)例,function [x ,y]=myfun(a ,b ,c) %函数定义行% H1行 用一行文字来综述函数的功能% 帮助文本 用一行或多行文本解释怎么使用函数 % 在命令行输入“help <functionname >”时可以使用它 % 函数体 一般从第一个空白行后开始% 注释 描述函数的行为,输入输出的类型% 在命令行输入“help <functionname >”时不会显示注释文本 x =prod(a ,b); % 开始编写函数代码 例 编写求平均值和均方差的函数M 文件.function [mean ,stdev]=stat(x)% stat mean and standard deviation% for a vector x ,stat(x) returns the mean and standard deviation of x% for a matrix x ,stat(x) returns two row vectors containing ,respectively , % the mean and standard deviation of each column . [m n]=size(x); if m ==1m =n ; % handle case of a row vector endmean =sum(x)/m ;stdev =sqrt(sum(x.^2)/m-mean.^2);输入:x =[2 5 -7 8 3]; [xm ,xd]=stat(x) 结果为:xm =2.2000 xd =5.0359.简单图形的绘制例 在同一窗口中绘制函数sin(),2sin ,3sin 63y x y x y x ππ⎛⎫⎛⎫==+=+ ⎪ ⎪⎝⎭⎝⎭的图形.程序为:x=0∶pi/100∶2*pi;y1=sin(x);y2=2*sin(x+pi/6);y3=3*sin(x+pi/3);plot(x,y1,‘-r’,x,y2,‘∶g’,x,y3,‘-.b’)gridhold onlegend(‘sin(x)’,‘2sin(x+pi/6)’,‘3sin(x+pi/3)’)title(‘sine函数系’)xlabel(‘X轴’)ylabel(‘Y轴’)gtext(‘sin(x)’)gtext(‘2sin(x+pi/6)’)gtext(‘3sin(x+pi/3)’)hold off例统计图形随机产生一个三阶矩阵,画此矩阵的直方图.程序为:rand(‘seed’,5)y=fix(10*rand(3));subplot(2,2,1);bar(y);title(‘直方图’);subplot(2,2,2);bar3(y);title(‘三维直方图’);subplot(2,2,3);pie(y);title(‘饼图’);subplot(2,2,4);pie3(y,[0 1 0 0 1 0 0 1 1]);title(‘三维饼图’);二微分方程的数值解实际问题中一些较为复杂的微分方程,尽管为一阶,但也很难求出其解析解.即使求出了解析表达式,而计算相应已知变量的函数值或者已知函数值反过来计算相应的自变量的值也是比较困难的.在这种情况下就需要求微分方程的数值解.微分方程及方程组解析解;微分方程近似解的欧拉折线法;用龙格-库塔法求微分方程的数值解.一、常微分方程(组)的MATLAB解析解方法那些可以用积分方法求解的微分方程和微分方程组,可以用dsolve命令来求通解或特解.函数调用格式:y=dsolve(f1,f2,…,fm)或y =dsolve(f1,f2,…,fm ,‘x’)参数f1,f2,…,fm 既可以是微分方程,又可以是初始条件. 用Dy 表示y ',用Dny 表示y 的n 阶导数,如D2y 表示y ''; 还可以用D2y(0)=1这类符号来表示y (0)''=1这样的初始条件;‘x ’的作用是指明自变量,默认为t ;在自变量不用t 表示时,必须指明哪个是自变量. 如果找不到解析解,则返回警告信息.例 求二阶微分方程cos(2)y x ''=的通解以及满足初始条件(0)1,y = (0)0y '=的特解.程序为:y =dsolve(‘D2y =cos(2*x)’,‘x’) % 自变量不用t 表示,必须指明自变量 y =dsolve(‘D2y =cos(2*x)’,‘y (0)=1’,‘Dy (0)=0’,‘x’) 结果为:y =-1/4*cos(2*x)+C1*x+C2 y =-1/4*cos(2*x)+5/4即二阶微分方程cos(2)y x '=的通解为121cos(2)4y x C x C =-++ (1C 、2C 为相互独立的任意常数)其满足初始条件(0)1,(0)0y y '==的特解为15cos(2)44y x =-+.例 求微分方程25e cos 2xy y y x '''-+=的通解.程序为clear ;simplify(dsolve(‘D2y -2*Dy+5*y =exp(x)*cos(2*x)’, ‘x ’)) 结果为: ans =1/8*exp(x)*(8*sin(2*x)*C2+8*cos(2*x)*C1+cos(2*x)+2*sin(2*x)*x) 即线性微分方程25e cos 2xy y yx '''-+=的通解为211(8sin 28cos 2cos 22sin 2)8xy e C x C x x x x =+++ (1C 、2C 为相互独立的任意常数) .另外,解微分方程组时的命令格式为:[x ,y]=dsolve(‘Dx =f(x ,y)’,‘Dy =g(x ,y)’)或s =dsolve(‘Dx =f(x ,y)’,‘Dy =g(x ,y)’)例 求微分方程组d 2e d d 0d tx x y t y x y t⎧++=⎪⎪⎨⎪--=⎪⎩在初始条件001,0t t xy==⎧=⎪⎨=⎪⎩下的特解.程序为:clear ;[x ,y]=dsolve(‘Dx =-x -2*y+exp(t)’,‘Dy =x+y ’,‘x(0)=1’,‘y(0)=0’) 结果为: x = cos(t) y =1/2*sin(t)-1/2*cos(t)+1/2*exp(t)或程序为:s =dsolve(‘Dx =-x -2*y+exp(t)’,‘Dy =x+y’,‘x(0)=1’,‘y(0)=0’) s.x ,s.y 结果为: s =x: [1x1 sym] y: [1x1 sym] ans =cos(t) ans =1/2*sin(t)-1/2*cos(t)+1/2*exp(t)即满足初始条件的特解为cos 111sin cos 222tx t y t t e =⎧⎪⎨=-+⎪⎩.二 常微分方程(组)初值问题的数值解1.编写向前欧拉公式法(折线法)的MATLAB 计算程序欧拉折线法的思想为: 给定微分方程(,)y f x y '=和初始条件00()y x y =,考虑()y x 的线性近似:000()()()()L x y x y x x x '=+-如果x 在包含0x 的较小的区间内,则函数()L x 是()y x 的较好的近似.欧拉折线法是通过一系列线性近似得到在较大区间内()y x 的近似解.用折线法求解近似解的一般步骤为:10d x x x=+,1000(,)d y y f x y x=+21d x x x =+,2111(,)dy y f x y x=+ … …1d n n x x x -=+,111(,)d n n n n y y f x y x---=+连接点 00112233(,),(,),(,),(,),x y x y x y x y的折线就是微分方程(,)y f x y '=满足初始条件00()y x y =的一个近似解.例 用折线法解初值问题:01,(0)1(0,d 0.1)y y y x x '=+===程序为:clear clf szy =[ ]; y =1;szy =[szy ;y]; for x =0.1∶0.1∶1 y =y+(1+y)*0.1; szy =[szy ;y]; endszy 输出为:szy = 1.0000 1.2000 1.4200 1.66201.92822.2210 2.5431 2.89743.2872 3.71594.1875% 用折线法算出的初值问题在点0:0.1:1x =处的数值解(存放在数组中)而输入:y =dsolve(‘Dy =1+y ’,‘y(0)=1’,‘x ’) 可以算得此微分方程初值问题的精确解:y =-1+2*exp(x)为了比较精确解和近似解的误差,编写程序算出精确解在点0:0.1:1x =处的纵坐标(存放在数组jqy 中)jqy =[ ];for x =0∶0.1∶1 y =-1+2.*exp(x); jqy =[jqy ;y];end jqy现在将折线和曲线在同一坐标系中画出来,如图5-1所示. x =0∶0.1∶1;plot(x ,szy ,‘o ’,x ,jqy)折线法的数值解与函数真实值从输出结果容易观察到:此方法在经过多步以后,其误差会积累起来.现在输入:err=jqy-szy输出为:err =0 0.0103 0.0228 0.0377 0.05540.0764 0.1011 0.13010.1639 0.2033 0.2491%在点0:0.1:1x 处的精确解与近似解相除所得的差.从输出容易观察到:此方法在经过多步以后,其误差会积累起来.为了减少误差,一种方法是减少步长d x的值.另外,在近似算法上也有很多改进办法.改进的此法可以算出此问题的数值解,存放在数组gjszy中.程序为:x=0∶0.1∶1;h=0.1;gjszy=[ ];y=1;gjszy=[gjszy;y];for i=1∶length(x)-1y1=y+(1+y)*h;y=y+(1+y+1+y1)*h/2;gjszy=[gjszy;y];endgjszyplot(x,gjszy,‘o’,x,jqy,‘r’)比较结果如图5-2所示.改进方法的数值解与函数真实值2.用MATLAB 求解的函数微分方程(组)那些不可以用积分方法求解的微分方程初值问题,可以用MA TLAB 的函数,如二三阶龙格-库塔法ode23或四五阶龙格-库塔法ode45命令来求其数值解.对于微分方程(组)的初值问题T T11T 000010()(,),(,,),(,,)(),(,,)n n n x t f t x x x x f f f x t x x x x ⎧===⎪⎨==⎪⎩可用下面的MA TLAB 命令实现计算:[t,x]=ode23(odefun ,ts ,x0,options)[t,x]=ode45(odefun ,ts ,x0,options)这里ode23用的是3级2阶的龙格-库塔法公式, ode45用的是5级4阶的龙格-库塔公式.输入参数odefun 是待解方程写成的函数M 文件或inline 格式的函数(,)f t x .function dx =f(t,x) dx =[f1;f2;…;fn];或fun =inline(‘f1’,‘f2’,…,‘fn’,‘t’,‘x’);如果输入ts =[t0,t1,…,tf],则输出为在指定时刻t0,t1,…,tf 的函数值.如果输入ts ∶k ∶tf ,则输出为在[t0,tf]内以k 为间隔的等分点处的函数值.x0为函数初值(n 维向量). options 可用于设定误差限(options 默认时设定相对误差310-,绝对误差610-),命令为:options =odeset(‘reltol ’,rt ,‘abstol ’,at) 这里rt ,at 分别为设定的相对误差和绝对误差.命令的输出t 为由输入指定的ts ,x 为相应的函数值(n 维向量).例 求初值问题1.2(1)(1)0,1xy y xy y y'++-==在区间[1.2,4]上的近似解,并作图.程序为:fun =inline(‘(1+x*y)*y/(x*y -1)’,‘x ’,‘y ’); [x,y]=ode45(fun ,[1.2,4],1); [x,y]ode45(fun ,[1.2,4],1) % 或 plot(x ,y) 其数值解如图5-3所示.初值问题的数值解例求方程23,0.5x y y x y ='=+=的近似解(0 1.5)x ≤≤.程序为:fun =inline(‘y^2+x^3’,‘x ’,‘y ’); ode23(fun ,[0,1.5],0.5)% 绘制初值问题的数值曲线,命令中的[0, 1.5]表示x 的区间,0.5表示y 的初值. % 输出为圆圈表示计算过程中选取的点,并得到该点的坐标. 其近似解如图5-4所示.初值问题的数值解如果输入:[x,y]=ode23(fun ,[0,1.5],0.5); [x,y] % 显示点处的坐标 输出结果略.例 求V an der Pol 方程2(1)0,0,0.5x x y y y y yy ==''''--+===-在区间[0, 20]上的近似解.令12d ,d y y y y x==,则原方程转化为方程组1222121d d d (1)d y y x y y y y x⎧=⎪⎪⎨⎪=--⎪⎩编写M 函数vdp.mfunction dydt =vdp(t,y)dydt =[y(2); (1-y(1)^2)*y(2)-y(1)];回到MA TLAB 命令窗口,输入求V an der Pol 方程近似解命令[t,y]=ode23(@vdp ,[0, 20], [0,-0.5]);plot(t ,y(:,1));可以观察到近似解(见图5-5).初值问题的数值解三 数值积分如果函数是用离散数据给出的,或者无法找出原函数的积分,这时可以用数值积分法得到积分近似值.用梯形近似代替小曲边梯形得到的积分算法,叫做梯形求积算法.在此基础上为计算更加快速、精确而对算法作一些优化,可以得到很多算法.这里给出三种算法.梯形求积分函数trapz( ),辛普生(Simpon)自适应法quad( ), Newton-Cotes 高阶自适应法quad8( ).一 梯形求积分函数trapz( )常用格式有:trapz(Y), trapz(X,Y)X ,Y 是同维向量,trapz(Y)表示对被积函数Y 以间距为1取点,根据所得到的函数值Y 进行梯形积分计算,如果取点时是以a 为间距取的,则实际积分值为trapz(Y)*a ; 当间距不均匀时,采用trapz(X,Y),它是求Y 关于X 的积分值.例采集到的函数s i n xx的一列函数值如表3-8所示,据此用梯形函数trapz(),计算ππ2sindxxx⎰.程序如下:x=[0.5*pi,0.6*pi,0.7*pi,0.75*pi,0.85*pi,0.95*pi,pi];y=[0.6366,0.5046,0.3679,0.3001,0.1700,0.0524,0];trapz(x,y)运行结果:ans =0.4817如果以间距π20取点进行计算.程序如下:x=[pi/2∶pi/20∶pi];y=sin(x)./x;%注意这时函数的写法,通常的“/”用“./”代替trapz(x,y)运行结果:ans =0.4814由于数据增加,结果更加精确.二辛普生(Simpon)自适应法quad( )该函数的常用格式为:quad(f,x1,x2),quad(f,x1,x2,e)计算函数f从x1到x2的积分值21dx x f x⎰,e为指定误差范围,默认是610-.例用函数quad()计算ππ2s i ndxxx⎰.程序如下:syms xquad(‘sin(x)./x’,pi/2,pi) 运行结果:ans =0.4812三 Newton-Cotes 高阶自适应法quad8( )使用格式与quad( )相同,一般而言更加精确.例 用函数quad8( )计算210ed xx x ⎰.程序如下: syms xf =‘exp(x.^2).*x ’ quad8(f ,0,1) 运行结果:ans =0.8591 例人造地球卫星的轨道可以视为平面上的椭圆,中国第一颗人造地球卫星的近地点距离地球表面439 km ,远地点距离地球表面6 371 km ,求该卫星的轨道长度.问题分析与数学模型由于人造地球卫星的轨道可以视为平面上的椭圆,因此卫星轨道的参数方程为cos ,02πsin ,x a t t y b t =⎧⎨=⎩≤≤, a b分别为轨道椭圆的长、短半轴.根据计算参数方程弧长的公式,卫星轨道的长度可以用下面公式计算:4d L t=⎰于是卫星的轨道长度为4d L t=⎰模型求解与问题解答在MATLAB 中分别用梯形求积分法与辛普生自适应法进行计算如下. 梯形求积方法在MATLAB 命令窗口输入: a =8755;b =6810;t =[0∶pi/20∶pi/2];Y =sqrt(a^2*sin(t).^2+b^2*cos(t).^2); L1=4*trapz(t ,Y) L1 =4.9090e+004 辛普生自适应法编写m 文件L2.m 为:syms ty =‘sqrt(8755^2*sin(t).^2+6810^2*cos(t).^2)’;L2=4*quad(y ,0,pi/2) 运行程序:>> L2 L2 =4.9090e+004于是卫星的轨道长度的近似长度为44.90910⨯km .四 插值与拟合插值问题的提法是已知1+n 个节点),,1,0)(,(n j y x j j =,这里j x 互不相同,不妨设01n a x x x b =<<<= ,求任一插值点)(*j x x ≠处的插值*y .节点),(j j y x 可以看成是由某个函数)(x g y =产生的,g 的解析表达式可能十分复杂,或不存在解析形式,只是由节点给出的离散数据.求解的基本思路是,构造一个相对简单的函数)(x f y =,称为插值函数,使)(x f 通过全部的节点,即),,1,0()(n j y x f j j ==,再利用)(x f 计算插值,即*)(*x f y =.常用的有, 拉格朗日多项式插值, 分段线性插值, 三次样条插值, 牛顿均差插值, Hermite 插值, 分段三次插值和分段三次Hermite 插值.线性插值,样条插值和三次插值的MATLAB 程序是现成的,现在分析其用法. 一维插值程序:函数interp1进行一维插值.一维插值是进行数据分析和曲线拟合的重要手段.interp1函数使用多项式技术,用多项式函数拟合提供的数据,并计算目标插值点上的插值函数值.常用的语法形式是:yi=interp1(x ,y ,xi ,method)x 和y 为给定数据的矢量,长度相同.xi 为包含要插值的点的矢量, method 是一个可选的字符串,指定一种值方法,包括最近邻插值(method='nearest'): 该方法将插值点的值设置为已知数据点中距离最近的点的值.线性插值(method='linear'): 该方法用线性函数拟合每对数据点,并返回xi处的相关函数值.三次样条插值(method='spline'): 该方法用三次样条函数拟合每对数据点,用spline 函数在插值点处进行三次样条插值.或y=spline(x0,y0,x)这里x0,y0为节点数组(同长度),x 为插值数组,端点为边界条件. spline 命令还可处理上述第一类端点条件, 将原来的输入数组y0改为yy0=[a y0 b],这里a ,b 分别为)(),(0n x S x S ''.三次插值(method='pchip'或'cubic'): 该方法用pchip 函数对矢量x 和y 作分段三次Hermite 插值.以上这几种方法在速度,内存和平滑性等方面有差别,使用时可以根据需要选择.最近邻插值是最快的方法,但是得到的结果平滑性最差.线性插值比最近邻插值要占用更多的内存,运行时间略长.与最近邻法不同,它生成的结果是连续的.三次样条插值的运行时间最长,内存消耗比三次插值略少.它生成的结果平滑性最好.三次插值需要更多内存,而且运行时间比最近邻法和线性插值的长.但是,使用此法时,插值数据及导数是连续的. 例 已知数据x=[0 0.1 0.12 0.17 0.2 0.3 0.32 0.37 0.6 0.75 1]; y=[0.3 0.32 1 1.2 1.7 1.75 1.9 0.6 0.51 0.75 2];求数据xi=[0.7 0.05]的值程序如下:x=[0 0.1 0.12 0.17 0.2 0.3 0.32 0.37 0.6 0.75 1];y=[0.3 0.32 1 1.2 1.7 1.75 1.9 0.6 0.51 0.75 2]; xi=[0.7 0.05]yi=interp1(x ,y ,xi ,'linear') 用MATLAB 作二维插值如果在某区域测量了多个点的高程(节点),为了画出较精确的等高线图,得先插入多的点(插值点),计算这些点的高程(插值),就是二维插值,插值函数是二元函数.二维值在图像处理和数据可视化方面有很重要的应用.MATLAB 用函数interp2来二维插值.该函数的一般形式为:ZI=interp2(X ,Y ,Z ,XI ,YI ,method)Z是一个矩形数组,包含二维函数的值,X和Y为大小相同的数组.XI和YI为包含插值点数据的矩阵,method表示插值方法,为可选参数.MATLAB提供了三种不同的插值方法来二维插值.最近邻插值(method= 'neareast'): 该方法用分段常数曲面拟合数据,插值点的值是最近点的值.双线性插值(method= 'bilinear'): 该方法用双线性曲面拟合数据点,插值点的值是四个最近点的值的组合.此方法是分段双线性的,比双三次插值方法快,并且内存消耗更少.双三次插值(method= 'bicubic'): 该方法用双三次曲面拟合数据点,插值点的值是16个最近点的值的组合.此方法是分段三次的,结果的平滑性比前面两种的要好.这些方法要求X和Y数据是单调的,即从点到点,要么是递增的,要么是递减的.应该用meshgrid函数准备这些矩阵.另外,非等距插值的调用格式为:ZI=griddata(X,Y,Z,XI,YI,'指定插值方法')插值方法有:linear %线性插值(默认)bilinear %双线性插值cubic %三次插值bicubic %双三次插值nearest %最领域插值例用随机数据生成地貌图再做插值程序为:x=rand(100,1)*4-2;y=rand(100,1)*4-2;z=x.*exp(-x.^2-y.^2);ti=-2:0.25:2;[xi,yi]=meshgrid(ti,ti);zi=griddata(x,y,z,xi,yi);mesh(xi,yi,zi)hold onplot3(x ,y ,z ,'o')结果为:此例的数据为随机生成的,而函数griddata 可以处理无规则的数据.拟合拟合方法的求解思路有别于插值,以多项式拟合为例.对于给定的数据),(,),,(11n n y x y x ,选取适当阶数的多项式,例如二次多项式0122)(a x a x a x g ++=(也可以选取其他形式的函数),使)(x g 尽可能逼近这些数据.这可以通过求解如下的最小化的问题来实现:21022210,,1min()ni i i a a a i a x a x a y =++-∑也就是说,设法寻找多项式,使得它与观测数据最为逼近,但拟合多项式并不一定通过全部节点.曲线拟合是数据分析最常见的任务之一,MATLAB 提供了多种函数和工具来作曲线拟合. 最小二乘拟合假设一般的拟合函数形式为011()()m m y x x ββαβα=+++这里)(,),(1x x m αα 为m 个函数(多项式拟合取为幂函数).如果有n 组观测数据(,),1,,i i x y i n = ,)(m n >,将它代入上面的模型得到)()(110i m m i i x x y αβαββ+++≈此方程不一定有解.所谓拟合,就是确定参数m βββ,,,10 的一组值,使得计算得到的数值逼近观测数据i y .这些参数可通过解最小得到02011,,1m in((()())) (7)mnii m m i i yx x ββββαβα=-+++∑常见的最小二乘法包括线性最小二乘,加权线性最小二乘,非线性最小二乘等.求解非线性最小二乘问题有高斯—牛顿法和Levenberg —Marquart 法. 多项式曲线拟合MATLAB 的多项式拟合函数为polyfit 和polyval . MATLAB 用于多项式拟合的命令为:[p ,c]=polyfit(x0,y0,m) %作m 次多项式拟合这里p 为m 次多项式的系数向量.对于这个拟合好的多项式可以用y=polyval(p ,x)计算在x 处多项式的值y .用polyfit 函数计算拟合数据集的多项式在最小二乘意义上的系数,调用形式为:p=polyfit(x ,y ,n)这里x 和y 是包含要拟合的x 和y 数据的矢量, n 是多项式的阶次.例 数据x=[ 2 2.2 5 7 7.5],y=[5.2 43 75 25 85]作用三次多项式拟合程序为:p=polyfit(x ,y ,3)在一个更好的范围内计算polyfit 函数的估计值,并通过绘图比较. 程序为:x=[ 2 2.2 5 7 7.5]; y=[5.2 43 75 25 85]; p=polyfit(x ,y ,3) x0=1:.1:7.5; y0=polyval(p ,x0); plot(x ,y ,'o',x0,y0) grid on神经网络程序例据统计,20世纪60年代世界人口数据如表所示.表60年代世界人口数据有人根据表中数据,预测公元2000年世界人口会超过60亿.这一结论在20世纪60年代末令人难以置信,但现在已成为事实.而作出这一预测结果所用的方法就是数据拟合方法.根据数学模型,构造出能逼近表中数据的拟合函数.正是拟合函数反映了人口增长的趋势.根据表7-2的数据构造拟合函数,并预测公元2000年时的世界人口.问题分析与数学模型据人口增长的统计资料和人口理论数学模型知,当人口总数N 不是很大时,在不太长的时期内,人口增长接近于指数增长.因此,采用指数函数=N+e a bt对数据进行拟合.为了计算方便,将上式两边同取对数,得=+ln N a bt令lny N=,这样变换后的拟合函数为=+y t a bt()由人口数据取对数(ln=),在MATLAB命令窗口输入:y N>> x=[29.72 30.61 31.51 32.13 32.34 32.85 33.56 34.2034.83];>> y=log(x)y =Columns 1 through 63.3918 3.4213 3.4503 3.4698 3.4763 3.4920Columns 7 through 93.5133 3.5322 3.5505可得表.表 人口数据取对数后的结果根据表的数据及拟合函数()y t a bt =+,可以得到下面的方程组1960 3.39181961 3.42131962 3.5031963 3.46981964 3.47631965 3.49201966 3.51331967 3.53221968 3.5505a b a b a b a b a b a b a b a b a b +=⎧⎪+=⎪⎪+=⎪+=⎪⎪+=⎨⎪+=⎪+=⎪⎪+=⎪⎪+=⎩模型求解与问题解答在MATLAB 命令窗口输入:>> t =1960∶1968;>> y =[3.3918 3.4213 3.4503 3.4698 3.4763 3.4920 3.5133 3.5322 3.5505] ; >> A =[ones(9,1)t’] ; >> A\ y’ ans =-33.0431 0.0186 所以,方程组的解为33.0431, 0.0186a b =-=.代入拟合函数ea btN+=,有33.04310.0186()etN t -+=在MATLAB 命令窗口输入: >> exp(-33.0431+0.0186*2000) ans =63.8732所以2000年的世界人口预测为63.8732亿.这一数据虽然不是十分准确,但也基本反映了人口变化趋势.。
使用MATLAB进行数值计算
第 4 章 数值计算与符号计算相比,数值计算在科研和工程中的应用更为广泛。
MATLAB 也正是凭借其卓越的数值计算能力而称雄世界。
随着科研领域、工程实践的数字化进程的深入,具有数字化本质的数值计算就显得愈益重要。
较之十年、二十年前,在计算机软硬件的支持下当今人们所能拥有的计算能力已经得到了巨大的提升。
这就自然地激发了人们从新的计算能力出发去学习、理解概念的欲望,鼓舞了人们用新计算能力试探解决实际问题的雄心。
鉴于当今高校本科教学偏重符号计算和便于手算简单示例的实际,也出于帮助读者克服对数值计算生疏感的考虑,本章在内容安排上仍从“微积分”开始。
这一方面与第2章符号计算相呼应,另方面通过“微积分”说明数值计算离散本质的微观和宏观影响。
为便于读者学习,本章内容的展开脉络基本上沿循高校数学教程,而内容深度力求控制在高校本科水平。
考虑到知识的跳跃和交叉,本书对重要概念、算式、指令进行了尽可能完整地说明。
4.1数值微积分 4.1.1 近似数值极限及导数【例4.1-1】设x x x x f sin 2cos 1)(1-=,xx x f sin )(2=,试用机器零阈值eps 替代理论0计算极限)(lim )0(101x f L x →=,)(lim )0(202x f L x →=。
x=eps;L1=(1-cos(2*x))/(x*sin(x)),L2=sin(x)/x,L1 =L2 =1syms tf1=(1-cos(2*t))/(t*sin(t));f2=sin(t)/t;Ls1=limit(f1,t,0)Ls2=limit(f2,t,0)Ls1 =2Ls2 =1【例4.1-2】已知)sin(t x =,求该函数在区间 ]2 ,0[π中的近似导函数。
d=pi/100;t=0:d:2*pi;x=sin(t);dt=5*eps;x_eps=sin(t+dt);dxdt_eps=(x_eps-x)/dt;plot(t,x,'LineWidth',5)hold onplot(t,dxdt_eps)hold offlegend('x(t)','dx/dt')xlabel('t')图 4.1-1 增量过小引起有效数字严重丢失后的毛刺曲线x_d=sin(t+d);dxdt_d=(x_d-x)/d;plot(t,x,'LineWidth',5)hold onplot(t,dxdt_d)hold offlegend('x(t)','dx/dt')xlabel('t')图 4.1-2 增量适当所得导函数比较光滑【例4.1-3】已知)sin(t x =,采用diff 和gradient 计算该函数在区间 ]2 ,0[π中的近似导函数。
matlab用于计算方法的源程序
matlab用于计算方法的源程序1、newdon迭代法求解非线性方程function[xkt]=newdontoequation(f,df,x0,eps)%牛顿迭代法解线性方程%[xkt]=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)%[xk]=newdontoequation(f,df,1,0.5e-6)%[xkt]=newdontoequation(f,df,1,0.5e-6)%函数的最后一个参数也可以不写。
默认情况下,eps=0.5e-6%[xkt]=newdontoequation(f,df,1)ifnargin==3eps=\endtic;k=0;while1x=\k=\ifabs(x-x0)<eps||k>30break;endx0=x;endt=toc;ifk>=30disp('运算次数太多。
');x=\t=\end2、newdon迭代法求解非线性方程组functiony=\%牛顿迭代法解非线性方程组的测试函数%定义是必须定义为列向量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;functiony=\%牛顿迭代法解非线性方程组的测试函数的导数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[xkt]=newdontoequations(f,df,x0,eps)%牛顿迭代法解非线性方程组%[xkt]=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)%[xk]=newdontoequations(@ne wdonf,@newdondf,x0,eps)%[xkt]=newdontoequations(@newdonf,@newdondf,x0,eps)%函数的最后一个参数也可以不写下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab数值计算功能
1,基础运算
(1)多项式的创建与表达
将多项式(x-6)(x-3)(x-8)表示为系数形式
a=[6 3 8] % 写成根矢量
pa=poly(a)% 求出系数矢量
ppa=poly2sym(pa,'x') % 表示成符号形式
ezplot(ppa,[-50,50])
求3介方阵A的特征多项式
a=[6 2 4;7 5 6;1 3 6 ];
pa=poly(a)% 写出系数矢量
ppa=poly2sym(pa) %表示成符号形式
ezplot(ppa,[-50,50]) % 绘图
求x^3-6x^2-72x-27的根。
a=[1,-6,-72,-85]; % 写出多项式系数矢量
r=roots(a) % 求多项式的根
(2)多项式的乘除运算
c=conv(a,b) %乘法
[q,r]=deconv(c,a)% 除法
求a(s)=s^2+2s+3乘以b(s)=4s^2+5s+6的乘积
a=[1 2 3]
b=[4 5 6] % 写出系数矢量
c=conv(a,b)
c=poly2sym(c,'s') % 写成符号形式的多项式
展开(s^2+2s+2)(s+4)(s+1)并验证结果被(s+4),(s+3)除后的结果。
c=conv([1,2,2],conv([1,4],[1,1]))
cs=poly2sym(c,'s')
c=[1 7 16 18 8]
[q1,r1]=deconv(c,[1,4])
[q2,r2]=deconv(c,[1,3])
cc=conv(q2,[1,3])
test=((c-r2)==cc)
其他常用的多项式运算命令
pa=polyval(p,s) % 按数组规则计算给定s时多项式的值
pm=polyvalm(p,s)% 按矩阵规则计算给定s时多项式的值
[r,p,k]=residue(b,a) % 部分分式展开,b,a分别是分子,分母多项式系数矢量。
r,p,k分别是留数,极点和值项矢量。
p=poly(x,y,n) % 用n介多项式拟合给定的数据
polyder(p) %多项式微分
x=[1 2 3 4 5];
y=[5.5 43.1 128 290.7 498.4];
p=polyfit(x,y,3)
x2=1:0.1:5;
y2=polyval(p,x2);
plot(x,y,'o',x2,y2)
2,线性代数
1,求解方程的根
t=[0 0.3 0.8 1.1 1.6 2.3]';
y=[0.82 0.72 0.63 0.60 0.55 0.50]';
e=[ones(size(t)) exp(-t)]
c=e\y
t1=[0:0.1:2.5]';
y1=[ones(size(t1)),exp(-t1)]*c;
plot(t1,y1,'b',t,y,'ro')
2,逆矩阵及行列式
inv(a)
det(a)
pinv(a)
3,矩阵分解(略)
4,数据分析
max(x)求x各列的最大元素
mean(x)求x各列的平均值
median(x)找出x各列的中位元素
min(x)求出x各列的最小元素
S=cumsum(x)求x各列元素累计和
sort(x)使x的各列元素按递增排序。
std(x)求x各列的标准差。
sum(x)求x各列元素之和
prod(x)求x各列元素之积
cumprod(x)求x各列元素累计积
5,协方差和相关系数
C=cov(x) % 求协方差阵
C=cov(x,y)% 求两组随机变量的协方差
P=corrcorf(x)% 求相关阵
P=corrcorf(x,y)% 求两组随机变量的相关阵
6,微分与梯度
DX=diff(X,k) % 对x的列求k介微分矩阵
V=del2(U)% 求矩阵U的五点差分矩阵
dyx=diff(Y)./diff(X) % X,Y为同阶矩阵,差分计算按列进行
dyx=gradient(Y,dx) % Y是矢量,dx是X的梯度值
[GX,GY]=gradient(Z,dx,dy)% GX,GY分别为二元函数Z对x,y的偏导求x的微分
x=[1 ,10 ,20;2 ,12, 23;3, 14, 26;3 ,14 ,29]
diff(x)
二元函数的偏导数和梯度
x=-2:0.2:2;y=-2:0.2:2;
[xx,yy]=meshgrid(x,y);
Z=xx.*exp(-xx.^2-yy.^2);
[GX,GY]=gradient(Z,0.2,0.2);
contour(x,y,Z,'k'),hold on,
quiver(xx,yy,GX,GY,'r'),hold off
7,插值
编辑命令函数,计算四种插值函数,并用图形显示
x=0:10;y=sin(x);xi=0:.25:10;
%将插值方法定义为单元数组
strmod={'nearest','linear','spline','cubic'}
%将图标定义为单元数组
strlb={'(a) method=nearest','(b) method=linear','(c) method=spline','(d) method=cubic'};
for i=1:4
yi=interp1(x,y,xi,strmod{i});
subplot(2,2,i)
plot(x,y,'ro',xi,yi,'b'),xlabel(strlb(i))
end
x0=0:10;y0=sin(x0);
x=0:.25:10;
y=spline(x0,y0,x);
plot(x0,y0,'ro',x,y,'k')
在命令窗口中输入命令,计算四种二维插值结果,并用图形显示[x,y,z]=peaks(7);mesh(x,y,z)
[xi,yi]=meshgrid(-3:0.2:3,-3:0.2:3);
z1=interp2(x,y,z,xi,yi,'nearest');
z2=interp2(x,y,z,xi,yi,'linear');
z3=interp2(x,y,z,xi,yi,'spline');
z4=interp2(x,y,z,xi,yi,'cubic');
subplot(2,2,1)
mesh(xi,yi,z1)
subplot(2,2,2)
mesh(xi,yi,z2)
subplot(2,2,3)
mesh(xi,yi,z3)
subplot(2,2,4)
mesh(xi,yi,z4)。