MATLAB巢狀函式的應用
巢狀函式在求解積分上限中的應用
例1如下述積分表示式,已知a、e和l,如何求得β0?
本例關於β的積分結果不能解析表達,需要數值積分來做,同時還要求一個非線性方程。程式碼如下:
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
- 在滾動條滾動的時候,會根據滾動條的位置,使三角形中的數字變紅,最大值使數字全部變成紅色,最小值使得數字全變成黑色
程式碼如下:
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