MATLAB函數專題——應用篇

2022-02-01 間歇性熱血青年
1.求解方程

匿名函數和嵌套函數能很方便的表示所求方程,供fsolve等求解函數調用

eg.1 求解如下二維非線性方程組

% 匿名函數方法
clear,clc
f = @(x)[exp(-exp(-(x(1)+x(2))))-x(2)*(1+x(1)^2);...
x(1)*cos(x(2))+x(2)*sin(x(1))-1/2];
[x,fval,exitflag,output] = fsolve(f,[0,0]);
disp(['方程的解為:x1 = ',num2str(x(1)),',x2 = ', num2str(x(2))]);

運行結果如下:

% 局部函數方法
clear,clc
[x,fval,exitflag,output] = fsolve(@myfun,[0,0]);
disp(['方程的解為:x1 = ',num2str(x(1)),',x2 = ', num2str(x(2))]);
%

function f1 = myfun(x)

f1 = zeros(2,1);

f1(1) = exp(-exp(-(x(1)+x(2))))-x(2)*(1+x(1)^2);
f1(2) = x(1)*cos(x(2))+x(2)*sin(x(1))-1/2;
end

求解含參數方程(要求對不同參數一一求解方程相應的根)

eg.2 求解方程 

 ,其中a在[0, 2]中變化

%% 匿名函數表示含參方程
% 使用向量化函數arrayfun求解
clear,clc
f = @(a)@(x)exp(x)+x^a+x^(sqrt(x))-100; % 構造含參函數句柄
aa = [0:0.1:2];
f1 = @(a)fsolve(f(a),10); % 構造arrayfun函數可輸入的函數句柄
X = arrayfun(f1,aa);

% 繪製不同a對應方程解x的對應關係
fig1 = figure;
line1 = plot(aa,X,'-k','LineWidth',1.5);
xlabel('\ita','Interpreter','tex','FontName',...
'Times New Roman','FontSize',15);
ylabel('\itx','Interpreter','tex','FontName',...
'Times New Roman','FontSize',15);
title('\ite^{x}+x^{a}+x^{\surdx}-100','Interpreter','tex',...
'FontName','Times New Roman');

運行結果:

%% 局部函數方法
clear,clc
aa = [0:0.1:2];
f2 = @(a)fsolve(@(x)myfun(x,a),10); % 構造arrayfun函數可輸入的函數句柄
% 多重匿名函數形式外層變量@(a)作用整個'fsolve(@(x)myfun(x,a),10)'語句
% 內層變量@(x)作用'myfun(x,a)'語句
X = arrayfun(f2,aa);
% 繪製不同a對應方程解x的對應關係
fig = figure;
line1 = plot(aa,X,'-k','LineWidth',1.5);
xlabel('\ita','Interpreter','tex','FontName',...
'Times New Roman','FontSize',15);
ylabel('\itx','Interpreter','tex','FontName',...
'Times New Roman','FontSize',15);
title('\ite^{x}+x^{a}+x^{\surdx}-100','Interpreter','tex',...
'FontName','Times New Roman');
% -

function f1 = myfun(x,a)

f1 = exp(x)+x^a+x^(sqrt(x))-100;

end

2. 隱函數顯式表達

隱函數在數學上無法顯式表示,但可通過構造匿名函數來數值表達:對於給定的自變量可通過數值方法隨時求解因變量

eg.3 顯式表達 y關於 x的隱函數 

f = @(x)fsolve(@(y)(exp(y)+x^(y))^(1/y)-x^2*y,2);
disp(['當x = 1時,y = ', num2str(f(1))]);

此時f只接受標量x的輸入(fsolve這類函數只能進行標量計算),使用arrayfun實現向量化輸入

F = @(x)arrayfun(@(xx)fsolve(@(y)(exp(y)+xx^(y))^(1/y)-xx^2*y,2),x);
disp(['當x分別取[',num2str([1:5]),']時,y = [',num2str(F([1:5])),']']);

eg.4 顯式表示下列z關於x,y的隱函數

% 使用局部函數構造子函數
f = @(x,y)fsolve(@(z)myfun(x,y,z), 1);
% 初值>0時得到的是z大於0的解,初值<0時可達到z小於0的解
xx = [-5:0.5:5];yy = [-5:0.5:5];
[X,Y] = meshgrid(xx,yy);
Z = arrayfun(f,X,Y);
figure;
fig1 = surf(X,Y,Z);
fig1.EdgeColor = 'none';fig1.FaceAlpha = 0.5;
title('通過函數計算得到')
% 使用三維隱函數繪圖函數fimplicit3繪製對比
f = @(x,y,z)x.^2+y.^2-z.^2;
interval = [-5 5 -5 5 0 7];
figure;
fig2 = fimplicit3(f,interval);
fig2.EdgeColor = 'none';fig2.FaceAlpha = 0.5;
title('使用三維隱函數繪圖函數fimplicit3得到')
%

function f = myfun(x,y,z)

f = x^2+y^2-z^2;

end

運行結果:

3. 函數在表示高階微分方程組中的應用

eg.5 求解微分方程 

 在[0,5]範圍的解

首先將高階微分方程轉化為一階微分方程組:

令   

則原微分方程可轉化為如下微分方程組

% 使用嵌套函數進行求解
qiujie(3);
function qiujie(a)% 不同的參數a可輸出不同的結構
tspan = [0,5];
y0 = [1,1];
[t,y] = ode45(@dydt,tspan,y0);
figure;
line1 = plot(t,y(:,1),'-k','LineWidth',1.5); % 繪製y(t)曲線
hold on
line2 = plot(t,y(:,2),'--r','LineWidth',1.5); % 繪製y(t)導數曲線
hold off
lgd = legend;
set(lgd,'String',{'\ity', '\rmd\ity'},'FontName','Times New Roman','FontSize',15);
xlabel('\itt','FontName','Times New Roman','FontSize',15);
ylabel('\ity \rmand \rmd\ity','FontName','Times New Roman','FontSize',15);

% 使用嵌套函數定義微分方程組

function f = dydt(t,y)

f = zeros(2,1);

f(1) = y(2);
f(2) = 3*sin(a*t)-4*y(1); % 嵌套函數可使用主函數的參數
end
end

對於比較簡單的方程形式,也可使用匿名函數進行表示

qiujie(3);

function qiujie(a)

f = @(t,y)[y(2);3*sin(a*t)-4*y(1)]; % 構造匿名函數


tspan = [0,5];
y0 = [1,1];
[t,y] = ode45(f,tspan,y0);
figure;
line1 = plot(t,y(:,1),'-k','LineWidth',1.5); % 繪製y(t)曲線
hold on
line2 = plot(t,y(:,2),'--r','LineWidth',1.5); % 繪製y(t)導數曲線
hold off
lgd = legend;
set(lgd,'String',{'\ity', '\rmd\ity'},'FontName','Times New Roman','FontSize',15);
xlabel('\itt','FontName','Times New Roman','FontSize',15);
ylabel('\ity \rmand \rmd\ity','FontName','Times New Roman','FontSize',15);
end

當 a = 3 時的運行結果為:

4. Matlab將符號表達式轉化為函數句柄進行數值計算

在用符號(symbolic)運算得到一個符號表達式後,我們可能需要令其進一步參與數值運算。然而,很多數值運算函數,比如數值積分函數(quad,quadgk,integral)都只能接受函數句柄作為輸入。於是,將符號表達式轉化為函數句柄就成了必然。

如果不怕麻煩,完全可以通過手動輸入對應的符號表達式來建立函數句柄。然而,很多情況下我們得出的符號表達式可能極其複雜,甚至可能佔據很多行。此時,手動輸入顯然相當不便。於是,找到一種自動將符號表達式轉化為函數句柄的方法就顯得尤為重要。下面列舉出三種自動轉換的辦法:

clear,clc
syms x
y = exp(x)*x^2+x+1;
g = matlabFunction(y)
disp(['使用matlabFunction轉化得到的匿名函數為:g = ',func2str(g)]);
disp(['當x取x = 2時, g(2) = ', num2str(g(2))]);
format long;
X = fsolve(g,1);
disp(['方程',char(y),'的解為x = ',num2str(X)]);

vectorize的目的是將字符串(string)表達式裡的* / ^替換為.* ./ .^,以支持向量運算
cdot = vectorize(c)
%c為字符向量、字符串標量

eval(expression)
% expression 為字符向量和字符串標量是要計算的表達式

clear,clc
syms x
y = exp(x)*x^2+x+1;
g = eval(['@(x)' vectorize(y)]) % 執行構造函數句柄的操作
disp(['使用eval+vectorize轉化得到的匿名函數為:g = ',func2str(g)]);
disp(['當x取x = 2時, g(2) = ', num2str(g(2))]);

clear,clc
syms x
y = exp(x)*x^2+x+1;
g = str2func(['@(x)' vectorize(y)])
disp(['使用str2func+vectorize轉化得到的匿名函數為:g = ',func2str(g)]);
disp(['當x取x = 2時, g(2) = ', num2str(g(2))]);

matlab求解函數(fsolve、ode45)等接收的都是以x向量為自變量的方程或方程組,符號推導過程中的方程組變量x1,...xN需要表示成x = [x(1),...,x(N)]的向量形式。

clear,clc
syms x1 x2
y = 2*x1-x2-exp(-x1);
z = -x1+2*x2-exp(-x2);
g = matlabFunction([y;z],'Vars',[x1 x2]) % 以x1和x2為自變量的匿名函數
f = @(x)g(x(1),x(2)); % 構建以x向量為自變量的匿名函數句柄,x1 = x(1), x2 = x(2)
fsolve(f,[0,1])

相關焦點

  • matlab矢量函數的可視化
    matlab矢量圖流線圖streamlinestreamline(x,y,u,v,startx,starty)其中startx,starty分別為流線的坐標[x,y]=meshgrid(0:0.1:1,0:0.1:1);u=sin(x);v=-y;figure
  • matlab和c語言的區別
    它在數學類科技應用軟體中在數值計算方面首屈一指。MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。
  • Matlab函數大全
    . 3 2.運算符專題................................ ................................ ................................ .... 3 3.simulink 專題 ................................ ................................
  • MATLAB繪製區域圖形
    相關內容往期回顧MATLAB中繪製三維圖形MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對
  • 查看matlab中函數原始碼的方法
    為了提升 「2015CUMCM 參賽隊伍」運用matlab軟體實現數學建模算法的能力,沉著應對數學建模競賽的【模型軟體求解】問題,最終在國賽中獲得榮譽,數學中國精心準備了一套能夠滿足參賽者需求的精品課程「數學建模算法之matlab實現專題」,讓大家深入數模算法方法內容、matlab軟體實現與應用,從而能夠在日後的生活和工作中獲得應用。
  • Matlab中幾個數值積分函數的比較和優缺點
    trapz(y)二、[q,fcnt]= quad(fun,a,b,tol,trace,p1,p2...)Infinite or Not-a-Number function value encountered'意味著在積分計算時,區間內出現了浮點數溢出或者被零除。例2
  • MATLAB求數值積分方法(一)
    matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon函數求解非線性規劃
  • MATLAB處理NAN數據程序(含實例)
    中矩陣的入門知識MATLAB的輸入輸出input函數Matlab對fig文件導出數據matlab多項式(定義、四則計算、求根)MATLAB的switch選擇語句和input輸入語句視頻講解MATLAB的switch選擇語句和input輸入語句matlab中的歸一化處理的三種方法MATLAB求函數的導數和偏導
  • MATLAB非線性擬合函數nlinfit函數
    /log(x);endMATLAB相關內容往期回顧MATLAB中繪製三維圖形MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab
  • [20天精通MATlAB] Day1: matlab基本操作,認識數組和矩陣
    一、認識matlab        剛下載matlab之後,軟體界面如上圖所示。首先介紹matlab的基本計算功能用運算符號來進行加減乘除,比如對於一般的加減乘除用+-*/符號即可,乘方的使用^ 注意matlab中沒有整除符號,整除的方法是調用函數floor如使用floor(101/3)   -->  ans=33
  • matlab的Virtual Reality(虛擬實境)工具箱的應用簡介 VR館
    中的應用。目前的研究還主要集中在前面三項,主要是第一項,它具有五大特徵:   (1)立體感的視覺效果(2)存在感(3)多感知性(4)閉環交互方式(5)動態顯示    matlab的虛擬實境工具箱就是讓我們在matlab下虛擬實境,為什麼非得在matlab下用呢?這是因為可以利用matlab和simulink的強大功能來操作三維實體的位置、角度等等。說了這麼多,還是舉個小例子吧。
  • 數據挖掘Matlab零基礎自學學習路線圖
    MATLAB可以進行矩陣運算、繪製函數和數據、實現算法、創建用戶界面、連接其他程式語言的程序等,主要應用於工程計算、控制設計、信號處理與通訊、圖像處理、信號檢測、金融建模設計與分析等領域。matlab功能:數值分析、數值和符號計算、工程與科學繪圖、控制系統的設計與仿真、數字圖像處理、數位訊號處理、通訊系統設計與仿真、財務與金融工程等。
  • MATLAB論壇不可錯過的200篇帖子
    從這幅圖上就能看到,當前閱讀量最高的帖子是一篇題為「Matlab中plot函數一共能調用多少種顏色?」的帖子,閱讀量超過30萬。就帖子的內容而言,無論是對於初學者而言亦或是深諳MATLAB的朋友來說,都是有非常深刻的意義的。就拿這篇帖子來說,評論區的朋友從顏色的『r』,『g』等定義方式到『color』參數的定量定義,再到作圖的形狀定義,討論的特別全面。
  • MATLAB 與複數處理相關的函數
    matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon函數求解非線性規劃
  • MATLAB的solve函數求非線性解方程或方程組
    中繪製三維圖形MATLAB的輸入輸出input函數matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析
  • Matlab:符號變量、符號函數、泰勒級數
    點擊上方藍字關注 無距書鄉 獲取即時更新今天介紹一個新內容——符號變量及其函數,再展示一下符號函數的應用
  • SV與UVM接口應用篇之七:將Matlab算法模型嵌入UVM環境
    rockeric.com在 SV及UVM接口應用篇之四:Matlab及Simulink模型與UVM
  • MATLAB的compass函數繪製羅盤圖
    matlab詳細介紹畫柱形圖matlab中矩陣的入門知識matlab中legend函數的用法matlab繪圖--線性規劃圖解法示意Matlab 進度條的製作Matlab對fig文件導出數據Matlab中plot函數全功能解析Matlab的fmincon函數求解非線性規劃
  • 哈工大、哈工程被列入「名單」後,又不讓用MATLAB,網友都怒了
    matlab,相信上過研究生,博士的都知道,這個軟體的強大之處,因為寫論文,搞仿真,計算都是用matlab,畢竟這個軟體內置了幾乎所有常見的數學函數,畫圖函數,仿真繪圖十分方便。如果用c來做仿真計算,非累死人不可,很多函數都得自己編了。2019 年 3 年 15 日,哈工大發布了 MATLAB 校園版上線的通知,向全校師生提供 MATLAB 軟體單機版的個人註冊使用。
  • Matlab基本繪圖
    連享會-空間計量專題研討班matlab基本繪圖指令plot 函數的基本使用語法格式為:繪製一條曲線:plot(xdata, ydata, 』color_linestyle_marker』)繪製多條曲線:plot(xdata1, ydata1, 』clm1』, xdata2, ydata2, 』clm2』, ...)