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後,通過 包名.類名回 才能使用。答下...