在matlab裡呼叫函式,怎麼知道它計算過程中迭代了多少次呢

2022-01-19 15:36:59 字數 6735 閱讀 2841

1樓:業向真曲倫

在迴圈迭代前設定一個變數記錄次數,並初始化為0,比如iteration=0;

在子程式迴圈迭代計算內部新增語句iteration=iteration+1;

儲存該子函式的時候,新增一個函式輸出iteration,比如[x,y,...,iteration]=function(xx,yy,zz,.....);

然後呼叫這個修改後的子函式就可以了

2樓:宗進裔詩丹

函式如果沒有提供計數,你是母雞的。

在matlab裡呼叫一個函式,怎麼知道它計算過程中迭代了多少次呢

3樓:無敵狂雷七星劍

貼上曾經用來解開普勒方程的,其中n傳進來時值是1function [ e,n ] = diedai1( e0,e,m,n)

%此函式用一般迭代法求解開普勒方程

% 此處顯示詳細說明

e=m+e*sin(e0);

while(abs(e-e0)>1e-8)e0=e;

n=n+1;

[e,n]=diedai1(e,e,m,n);end

4樓:匿名使用者

在迴圈迭代前設定一個變數記錄次數,並初始化為0,比如iteration=0;

在子程式迴圈迭代計算內部新增語句iteration=iteration+1;

儲存該子函式的時候,新增一個函式輸出iteration,比如[x,y,...,iteration]=function(xx,yy,zz,.....);

然後呼叫這個修改後的子函式就可以了

5樓:我行我素

可在程式中加入計數變數看次數,也有的程式自帶這種計數變數的,如優化、迭代,因程式不同而異。

怎樣在matlab中執行迴圈迭代

6樓:ljh無名小卒

在matlab中執行迴圈主要是利用for語句。如下x = 0.3;

for i = 1:1000

x = (x+2.5)*x;

end在matlab中執行結果如圖:

算出來的x1000是無窮大

擴充套件資料malab中迴圈的用法

迴圈輸出變數

for i=1:4

iend

其中1:4代表一個行向量1 2 3 4,在matlab中,行向量的另外一個表示方法是[1 2 3 4],即for i=1:4等價於for i=[1 2 3 4],編寫程式時牢記一個點:

對於某次固定的迭代,i會從這個向量中取一個值,該值可以參與迴圈中的計算。

修改迭代步長

例子:遍歷1~10之間的所有奇數

for i=1:2:10

iend

其中1:2:10表示迭代從1開始,步長為2,最大不超過10,即代表行向量1 3 5 7 9。

7樓:小舅舅有點帥

在matlab中執行迴圈迭代的方法:

a是一個由nk個陣列成的陣列

對應的y也應該是由nk個陣列成的陣列

a=某陣列;

b=某常數;

d=某常數;

for k=1:1:nk

c=1;

n=0;

errf=1;

while errf>1e-8&n<100%計算結果精度要求1e-8,如果迭代超過100次還不收斂,退出迴圈。

y(k)=a(k)*b*c;

c1=y*d;

errf=(c1-c)/c1;

c=c1;

n=n+1;

end擴充套件資料matlab中執行迴圈的例子:

» num=0;eps=1;

» while (1+eps)>1

eps=eps/2;

num=num+1;

end» num

num =

53» eps=2*eps

eps =

2.2204e-016

由於eps不斷地被2除,eps逐漸變小以致於eps+1不大於1。matlab用16位,因此只能期望eps接近10-16, 在這一點上,(1+eps)>1是假(零),於是while迴圈結束。最後,eps與2相乘,因為最後除2使eps太小。

8樓:冬天不冷臨近街

xn+1=(xn+2.5)*xn (n=0,1,2,3,4,5.....)    xo=0.3

求x1000。首先我們要知道在matlab中執行迴圈迭代的方法:

a是一個由nk個陣列成的陣列、對應的y也應該是由nk個陣列成的陣列

那麼   a=某陣列;b=某常數;d=某常數;for k=1:1:nk;c=1;n=0;errf=1;求x1000:

while errf>1e-8n<100%計算結果精度要求1e-8,如果迭代超過100次還不收斂,退出迴圈。

所以有 :y(k)=a(k)*b*c;     c1=y*d;

errf=(c1-c)/c1;    x1000=c1。

擴充套件資料

在matlab中跳出迴圈迭代的方法: matlab中有關控制迴圈的有三個命令,break,continue和return。break就是直接跳出該層迴圈

continue就是直接進入該層迴圈的下一次迭代。return就是直接退出程式或函式返回了

大概的關係如下

return>break>continue

由於return之後就直接退出程式了,因此帶有return的多重迴圈最好是一個獨立的函式,實現特定的功能,如果還需要接著完成某一任務,那麼就寫一新的函式,而不是在原函式上繼續,否則return之後後面的**就不執行了。

對於簡單的跳出迴圈可能用這些命令就行了,那麼對於複雜的迴圈跳躍就不好應付了。matlab不提供goto指令,因此可以用其他辦法來迂迴解決。

9樓:讖述社會

在matlab中執行迴圈迭代的方法具體如下:

a是一個由nk個陣列成的陣列、

對應的y也應該是由nk個陣列成的陣列

a=某陣列;

b=某常數;

d=某常數;

for k=1:1:nk

c=1;

n=0;

errf=1;

求x1000:

while errf>1e-8n<100%計算結果精度要求1e-8,如果迭代超過100次還不收斂,退出迴圈。

y(k)=a(k)*b*c;

c1=y*d;

errf=(c1-c)/c1;

x1000=c1。

10樓:

x=0:1000;

x(1)=0.3;

//因為在matlab的陣列中沒有0下標,所以從1開始即x0=x1,所求的x1000=x1001

//迴圈語句中預設步長為1

for n=1:1000

x(n+1)=(x(n)+2.5)*x(n);

endx(1001)

matlab 圖中迭代公式怎麼編寫

11樓:手機使用者

拉格朗日

function y=lagrange(x0,y0,x)

n=length(x0);m=length(x);

for i=1:m

z=x(i);

s=0.0;

for k=1:n

p=1.0;

for j=1:n

if j~=k

p=p*(z-x0(j))/(x0(k)-x0(j));

endend

s=p*y0(k)+s;

endy(i)=s;

endsor迭代法的matlab程式

function [x]=sor_iterative(a,b)

% 用sor迭代求解線性方程組,矩陣a是方陣

x0=zeros(1,length(b)); % 賦初值

tol=10^(-2); % 給定誤差界

n=1000; % 給定最大迭代次數

[n,n]=size(a); % 確定矩陣a的階

w=1; % 給定鬆弛因子

k=1;

% 迭代過程

while k=n

x(1)=(b(1)-a(1,2:n)*x0(2:n)')/a(1,1);

for i=2:n

x(i)=(1-w)*x0(i)+w*(b(i)-a(i,1:i-1)*x(1:i-1)'-a(i,i+1:n)*x0(i+1:n)')/a(i,i);

endif max(abs(x-x0))=tol

fid = fopen('sor_iter_result.txt', 'wt');

fprintf(fid,'\n********用sor迭代求解線性方程組的輸出結果********\n\n');

fprintf(fid,'迭代次數: %d次\n\n',k);

fprintf(fid,'x的值\n\n');

fprintf(fid, '%12.8f \n', x);

break;

endk=k+1;

x0=x;

endif k==n+1

fid = fopen('sor_iter_result.txt', 'wt');

fprintf(fid,'\n********用sor迭代求解線性方程組的輸出結果********\n\n');

fprintf(fid,'迭代次數: %d次\n\n',k);

fprintf(fid,'超過最大迭代次數,求解失敗!');

fclose(fid);

endmatlab中龍格-庫塔(runge-kutta)方法原理及實現龍格-庫塔(runge-kutta)方法是一種在工程上應用廣泛的高精度單步演算法。由於此演算法精度高,採取措施對誤差進行抑制,所以其實現原理也較複雜。該演算法是構建在數學支援的基礎之上的。

龍格庫塔方法的理論基礎**於泰勒公式和使用斜率近似表達微分,它在積分割槽間多預計算出幾個點的斜率,然後進行加權平均,用做下一點的依據,從而構造出了精度更高的數值積分計算方法。如果預先求兩個點的斜率就是二階龍格庫塔法,如果預先取四個點就是四階龍格庫塔法。一階常微分方程可以寫作:

y'=f(x,y),使用差分概念。

(yn+1-yn)/h= f(xn,yn)推出(近似等於,極限為yn')

yn+1=yn+h*f(xn,yn)

另外根據微分中值定理,存在0t1,使得

yn+1=yn+h*f(xn+th,y(xn+th))

這裡k=f(xn+th,y(xn+th))稱為平均斜率,龍格庫塔方法就是求得k的一種演算法。

利用這樣的原理,經過複雜的數學推導(過於繁瑣省略),可以得出截斷誤差為o(h^5)的四階龍格庫塔公式:

k1=f(xn,yn);

k2=f(xn+h/2,yn+(h/2)*k1);

k3=f(xn+h/2,yn+(h/2)*k2);

k4=f(xn+h,yn+h*k3);

yn+1=yn+h*(k1+2k2+2k3+k4)*(1/6);

所以,為了更好更準確地把握時間關係,應自己在理解龍格庫塔原理的基礎上,編寫定步長的龍格庫塔函式,經過學習其原理,已經完成了一維的龍格庫塔函式。

仔細思考之後,發現其實如果是需要解多個微分方程組,可以想象成多個微分方程並行進行求解,時間,步長都是共同的,首先把預定的初始值給每個微分方程的第一步,然後每走一步,對多個微分方程共同求解。想通之後發現,整個過程其實很直觀,只是不停的逼近計算罷了。編寫的定步長的龍格庫塔計算函式:

function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%參數列順序依次是微分方程組的函式名稱,初始值向量,步長,時間起點,時間終點(引數形式參考了ode45函式)

n=floor((b-a)/h);%求步數

x(1)=a;%時間起點

y(:,1)=y0;%賦初值,可以是向量,但是要注意維數

for ii=1:n

x(ii+1)=x(ii)+h;

k1=ufunc(x(ii),y(:,ii));

k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2);

k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2);

k4=ufunc(x(ii)+h,y(:,ii)+h*k3);

y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6;

%按照龍格庫塔方法進行數值求解

end呼叫的子函式以及其呼叫語句:

function dy=test_fun(x,y)

dy = zeros(3,1);%初始化列向量

dy(1) = y(2) * y(3);

dy(2) = -y(1) + y(3);

dy(3) = -0.51 * y(1) * y(2);

對該微分方程組用ode45和自編的龍格庫塔函式進行比較,呼叫如下:

[t,f] = ode45(@test_fun,[0 15],[1 1 3]);

subplot(121)

plot(t,f)%matlab自帶的ode45函式效果

title('ode45函式效果')

[t1,f1]=runge_kutta1(@test_fun,[1 1 3],0.25,0,15);%測試時改變test_fun的函式維數,別忘記改變初始值的維數

subplot(122)

plot(t1,f1)%自編的龍格庫塔函式效果

title('自編的 龍格庫塔函式')

matlab在函式裡,如何呼叫另函式裡面求得的雅可比矩陣並賦值

function aa yake bb 呼叫bb函式,並將其返回值雅可比矩陣付給yakeend 函式bb用來計算雅可比矩陣 function yakebi bb yekebi 內?end有問題歡迎追問容 滿意請採納,謝謝!怎麼在matlab中求雅克比矩陣?matlab中jacobian是用來計算ja...

matlab主函式如何呼叫子函式?

function main format long i 145 t i x zeros 2,1 x 1,1 35 f t sin x 1,1 x 2,1 runge kutta t,x 1,1 子函式內容為 function x1 runge kutta x runge kutta積分方法解算。t ...

python中同類的函式怎麼呼叫另函式裡的資料

a 不是return了它麼 def c dic a 現在列印dic吧 study.a 前面加上類的全名就行了 python中同一個類的函式怎麼呼叫另一個函式裡的資料 如果是同bai一包裡面,直du接就可以使用,如zhi果不是同一個包,那麼需要先daoimport後,通過 包名.類名回 才能使用。答下...