How to get this while cycle?

1 回表示 (過去 30 日間)
Elia Paini
Elia Paini 2021 年 8 月 16 日
コメント済み: Elia Paini 2021 年 8 月 16 日
Hi, I'm trying to get a while cycle which checks convergence every iteration.
Within the cycle, I'm solving a system which returns each iteration 3 types of solutions: a (vector), B, C (matrices).
Subscript "0" is related to the (l-1) iteraton, the other refers to the (l) iteration.
I wrote this code:
while (abs(a_0-a) > 1e-6) & (abs(B_0-B) > 1e-6) & (abs(C_0-C) > 1e-6)
....
end
It starts, but it do only one iteration, I don't know why.
It should iterate until ALL residues are lower than 1e-6.
Probably it's wrong, maybe due to parentheses or logical operators. I've already tried to change them, but in the other cases it doesn't work.
What should I do?
Thank you for your help!!

採用された回答

Fabio Freschi
Fabio Freschi 2021 年 8 月 16 日
if B and C are matrices, make them vectors using :
while any(abs(a_0-a) > 1e-6) || any(abs(B_0(:)-B(:)) > 1e-6) || any(abs(C_0(:)-C(:)) > 1e-6)
  1 件のコメント
Elia Paini
Elia Paini 2021 年 8 月 16 日
Great, it works! Thank you!

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2021 年 8 月 16 日
while (abs(a_0-a) > 1e-6) || (abs(B_0-B) > 1e-6) || (abs(C_0-C) > 1e-6)
  5 件のコメント
Walter Roberson
Walter Roberson 2021 年 8 月 16 日
while any(abs(a_0-a) > 1e-6, 'all') || any(abs(B_0-B) > 1e-6, 'all') || any(abs(C_0-C) > 1e-6, 'all')
The implication is that at least one of your subtractions is giving back a matrix that is 2 or more dimensions.
Please check that a_0 and a, and B_0 and B, and C_0 and C, have the same orientation if they are vectors. For example,
(1:3).' - (1:3)
is not the vector [0 0 0]
Elia Paini
Elia Paini 2021 年 8 月 16 日
I checked, the couples have the same dimension and orientation.
a_0 and a are (4x1), B_0 and B are (4x2), C_0 and C are (4x3)

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by