1. 程式人生 > >MATLAB巢狀函式的應用

MATLAB巢狀函式的應用

巢狀函式在求解積分上限中的應用

例1如下述積分表示式,已知a、e和l,如何求得β0?
例1

本例關於β的積分結果不能解析表達,需要數值積分來做,同時還要求一個非線性方程。程式碼如下:
function sol=example1(a,e,l)
    function f=fun1(beta)
        f=a.*(1-e.^2)./(1-e.^2*sin(beta).^2).^(3/2);
    end
    function g=fun2(beta0)
        g=quadl(@fun1,0,beta0)-l;
    end
sol=fzero(@fun2,3);
end

本例採用了兩個巢狀函式,fun1和fun2,fun1的功能是建立積分表示式,fun2的功能是建立關於β0的非線性方程。由於a、e和l是已知的,因此,a、e和l作為整個函式example1的輸入,實際應用中給定一組a、e和l作為整個函式example1的輸入。給定a=20、e=0.6和l=6,可以求解相應的解如下:

ol=example1(20,0.6,6)

sol =

    0.4519

巢狀函式在GUI中的應用

用Matlab生成一個三角形介面
要求

  1. 圖上的數字根據行數和列數動態生成,每一層都比上面大1
  2. 在滾動條滾動的時候,會根據滾動條的位置,使三角形中的數字變紅,最大值使數字全部變成紅色,最小值使得數字全變成黑色
    程式碼如下:
function triangle_table
fig=figure('defaultuicontrolunits','normalized','name','triangle_table',...
    'numbertitle','off'
,'menubar','none'); ah=axes('Pos',[.1 .2 .75 .75],'Visible','off'); slider_h=uicontrol('style','slider','units','normalized','pos',... [0.1,0.05,0.75,0.05],'sliderstep',[1/6,0.05],'callback',@change_color); hold on for k=0:6 plot(0:6-k,(6-k)*ones(1,(7-k)),'k'); plot(k*ones(1,(7-k)),k:6,'k'); end plot([0
,6],[0,6],'k'); hold off; for x=1:5 for y=1:x text(y-0.5,x+0.5,num2str(x),'color','k','tag','數字'); end end for k=0:5 text(k+0.1,k+0.5,[num2str(k),'.5'],'tag','數字'); end %=====slider's callback function(nested function)============ function change_color(hObject,eventdata) v=round(6*get(slider_h,'value')); num_h=findobj('tag','數字'); num_pos=get(num_h,'pos'); red_num_logic=cellfun(@(x)(x(1)<=v&&x(2)<=v),num_pos); set(num_h(red_num_logic),'color','r'); set(num_h(~red_num_logic),'color','k'); end end

生成的示意圖
這裡寫圖片描述
本例生成介面的思路是用plot來畫線,用text函式來填格子。每次移動滾動條後,得到當前滾動條的值。根據這個值來判斷究竟把那些數字設成紅色那些設成黑色。slider_h是滾動條的控制代碼,它的回撥函式change_color用巢狀函式來實現,這樣,slider_h對於巢狀函式來說是可見的,不採用額外的引數傳遞方式來傳遞到回撥函式內部。

巢狀函式在3D作圖中的一個應用

畫出下列函式的影象
這裡寫圖片描述
本例需要計算兩個求和項,其中最外層要求一個無窮級數,分析表示式,可以得知,實際計算中,N不必取到無窮,只要取到30就可以達到較高的精度。程式碼如下

function [m,n,TT]=plot3dnmT(N,L)
%N:inf 的近似,L:[0,2]區間的剖分個數
C=zeros(N,1); %nested-function;Tmn=calcT(mm,nn)中用來儲存計算結果
m=linspace(0,2,L);
[m,n]=meshgrid(m,m);
TT=zeros(size(n)); %和網格資料m,n對應的計算出來的T(m,n)網格資料
for ii=1:L
    for jj=1:L
        TT(ii,jj)=calcT(m(ii,jj),n(ii,jj));
    end
end
%================計算T(m,n)的nest-function
    function Tmn=calcT(mm,nn)
        for N1=1:N
            C(N1)=(mm^N1/gamma(N1+1))*sum(nn.^(0:N1-1)./gamma(1:N1));
            Tmn=1.0-exp(-mm-nn)*sum(C);
        end
    end
mesh(n,m,TT)
end

得到如圖
這裡寫圖片描述

巢狀函式表示待優化的目標函式

求下面表示式的最小值
已知w=[π/2,π,3π/2];N=[π/2-1,-2,-3π/2-1]
這裡寫圖片描述
其中,m在[0,2]範圍內
程式碼如下:

function m=Findm
w=[pi/2,pi,pi*1.5];
N=[pi/2-1,-2,-1.5*pi-1];
    function y=ObjectFun(m)
        y=(quadl(@(t)t.^m.*cos(t),0,w(1))-N(1))^2+...
            (quadl(@(t)t.^m.*cos(t),0,w(2))-N(2))^2+...
            (quadl(@(t)t.^m.*cos(t),0,w(3))-N(3))^2;
    end
m=fminbnd(@ObjectFun,0,2);
end

上述程式碼中,目標函式即y用巢狀函式ObjectFun來表示。fminbnd第一個輸入引數就是ObjectFun的控制代碼,第二第三個引數是求解最小值的範圍。執行後得到結果如下:

>> format long
>> m=Findm

m =

   1.000000256506471

巢狀函式在表示微分方程方面的應用

求下面的微分方程在[0,5]範圍的解
y″+4y=3sin(at)
其中,a是引數,初始條件為:y(0)=1,y′(0)=0。
本例要想應用matlab的微分方程求解函式ode45求解,需要改變一下形式,即變成一階微分方程式的形式:
這裡寫圖片描述
其中y₁(t)對應於函式y(t),而y₂=y′(t).
程式碼如下:

function example5(a)
tspan=[0,5]; %變數求解區間
y0=[1,0];    %初始值
[t,y]=ode45(@tfys,tspan,y0) %呼叫ode45求解方程
figure;
plot(t,y(:,1),'k-');        %畫函式y(t)的曲線
hold on;
plot(t,y(:,2),'k:');        %畫函式y(t)導數的曲線
set(gca,'fontsize',12);     %設定當前座標軸字型大小
xlabel('\itt','fontsize',16); %標註x軸
ylabel('\ity','fontsize',16); %標註y軸
%用巢狀函式定義微分方程組
    function dy=tfys(t,y)
        dy(1,1)=y(2);        %對應於粒子中方程組的第一個方程
        dy(2,1)=3*sin(a*t)-4*y(1); %對應於例子中方程組第二個方程
    end
end

譬如,當a=6時,執行example5(6)得到如圖
這裡寫圖片描述

相關推薦

MATLAB函式應用

巢狀函式在求解積分上限中的應用 例1如下述積分表示式,已知a、e和l,如何求得β0? 本例關於β的積分結果不能解析表達,需要數值積分來做,同時還要求一個非線性方程。程式碼如下: function sol=example1(a,e,l) f

C++ 建構函式初始化呼叫順序及類函式內部函式情況

C++建構函式初始化順序 C++建構函式按下列順序被呼叫:(1、2、3、4是按照優先順序順序來的!) (1)任何虛擬基類的建構函式按照它們被繼承的順序構造; (2)任何非虛擬基類的建構函式按照它們被繼承的順序構造; (3)任何成員物件的建構函式按照它們宣告的順序呼叫;(如果成員物件有前面出現

python函式呼叫順序、高階函式函式、閉包詳解

  一:函式呼叫順序:其他高階語言類似,Python 不允許在函式未宣告之前,對其進行引用或者呼叫錯誤示範: def foo(): print 'in the foo' bar() foo() 報錯: in the foo Traceback (most re

python 中高階函式函式

 1、高階函式:變數可以指向函式;                         函式的引數可以接收變數;      

在VB程式中其它應用程式

  執行主程式時被巢狀其中的另一個應用程式會被釋放出來,當然也可以轉而執行這個被釋放出來的應用程式,網上好多破解程式就是採用這種方法實現的。本文重點介紹如何將一個已經存在的應用程式巢狀到VB程式中。 新建工程,執行“外接程式”—“外接程式管理器”,選擇載入“VB6 資源管

python的本地變數,全域性變數,函式的作用域,函式引用包裝函式

#!/usr/bin/python # # Author:Tom # Date:2017/04/13 # Email:[email protected] # Test:function scope def test_func_scope(m): a =

python函式內嵌,函式

python,函式巢狀,到底是個什麼東東? 很少有人用,但是,有時確實會用: def multiplier(factor): def multiplyByFactor(number): return number*factor retu

匿名函式,子函式函式

一、匿名函式 anonymous function 匿名函式基本定義 fhandle = @(arglist)expr expr 具體的函式表示式 arglist 指定的函式自變數 匿名函式的種類 (1)單變數匿名函式 f = @(x)

arm64彙編篇-06函式的彙編原理

x0x1概念:一個函式的引數系統是將其從x0到x7去賦值的,但是計算後的結果卻是返回到x0暫存器中,這樣便涉及到暫存器資料的保護。原理:  對公用的引數和返回值先做棧保護儲存起來,然後等要用的時候到對應的記憶體地址中取出來使用。例項:1.建立demo工程。2.在mian檔案中

HTML中的函式使用基礎(函式定義,函式呼叫,函式引數,函式返回值,函式,遞迴函式,變數作用域,內建函式,其他定義函式的方法)

HTML中的函式使用基礎 函式實質上是一個類似於單獨的邏輯單元的JavaScript程式碼,使用函式可以使程式碼更為簡潔,提供重用性,在JavaScript中,大約有95以上的程式碼是包含在函式中的,由此可見,函式在JavaScript中地位相當重要。 1、函式定義 在

一文搞懂Python函式(匿名函式函式、閉包、裝飾器)!

## Python函式定義、匿名函式、巢狀函式、閉包、裝飾器 [TOC] #### 函式核心理解 > - 函式也是物件,可以把函式賦予變數 > - 可以把函式當作引數,傳入另一個函式中 > - 可以在函式裡定義函式,函式巢狀 > - 函式的返回值也可以是函式物件,閉包 #### 1. 函式定義 `

Excel中IF函式的多條件判斷(),與LOOKUP函式的聯合應用

1、IF函式的多條件判斷 當IF函式要對多個條件進行判斷時,除了AND和OR函式(前面文章介紹),更多的情況需要用到IF函式的巢狀。 例如要對學生的分數進行評級,當分數小於60分時,不及格;分數大於等於60分小於70分時為及格,以此類推。 選擇單元格—輸入公式=IF(B2 2、LOOKUP函式基礎應用

Vue中的 slot插槽的簡單應用——input中按鈕的效果

場景: 需要一種類似於把按鈕放在input最右邊的效果 解決辦法: 1,發現在Vue中怎麼巢狀都出不了效果,網上搜到的一種html寫法(但是和Vue中的el-table-column有些影響): <form role="form"> <div cla

Python_從零開始學習_(21) 函式的返回值和呼叫

1.  函式的返回值 在程式開發中,  有時候,  會希望 一個函式執行結束後,  告訴呼叫者一個結果,  以便呼叫者針對具體的結果做後續的處理 返回值 是函式 完成工作 後,  最後 給呼叫者的 一個結果

Python 函式函式的定義。函式的引數、返回值。函式

  demo.py(函式定義): # say_hello() # 不能在定義函式之前呼叫函式 # Python 直譯器知道下方定義了一個函式 def say_hello(): """函式的說明文件""" print("hello 1") print("

Python之路Python全域性變數與區域性變數、函式多層函式遞迴 Python之路Python全域性變數與區域性變數、函式多層函式遞迴

Python之路Python全域性變數與區域性變數、函式多層巢狀、函式遞迴 一、區域性變數與全域性變數   1、在子程式中定義的變數稱為區域性變數,在程式的一開始定義的變數稱為全域性變數。全域性變數作用域是整個程式,區域性變數作用域是定義該變數的子程式。 全域性變數

Python中函式以及函式的繼承

# a = 10 # b = 0 # c = 5 # try: # print("a的值是:%d,b的值是:%d"%(a,b)) # # f = c.open("a.txt") # print(f) # d = a / b # print("%d除以%d的值為

名稱空間和函式

2. 名稱空間: 區域性名稱空間 全域性名稱空間 內建名稱空間 載入順序: 內建 > 全域性 > 區域性 取值順序: 區域性 > 全域性 > 內建 作用域: 全域性作用域: 內建 + 全域性 區域性作用域: 函式區域性 # print(glo

Mysql 聚合函式使用

目的:Mysql 聚合函式巢狀使用 聚合函式不可以直接巢狀使用,比如: max(count(*)) 但是可以巢狀子查詢使用  eg:  注:後面那個 as 必須要寫 select max(total) from ( select count(*) as to