Exempting imaginary numbers from the output of an expression using an if statement.

3 ビュー (過去 30 日間)
Coding Heron's formula: If triangle T has sides a,b,c, given that a semiperimeter is s = (a+b+c)/2 then the area of any triangle is .
I am working out the best way(s) to say "Matlab! if any of (s-a), (s-b), (s-c) is < 0, multiply inside the square root by a -1." This way I avoid imaginary numbers in the output and keep the geometry accurate. 3 things came to mind right away, in order of priority: use an if statement, a for loop, or something new entirely!
Here is the brainstorming-
v = [1:25];
a = randi([length(v)])
a = 6
b = randi([length(v)])
b = 9
c = randi([length(v)])
c = 6
P = a + b + c
P = 21
s = P/2
s = 10.5000
% how to s > a,b,c so that imaginary numbers do not happen
check1 = (s-a)
check1 = 4.5000
check2 = (s-b)
check2 = 1.5000
check3 = (s-c)
check3 = 4.5000
if sqrt(s.*(s-a).*(s-b).*(s-c))
check1 <0
check2 <0
check3 <0
AT = sqrt(s.*(-1.*((s-a).*(s-b).*(s-c))))
end
  1 件のコメント
Julian
Julian 2023 年 12 月 1 日
編集済み: Julian 2023 年 12 月 1 日
Upon further inspection, I noticed that I do not need to break them into cases, and can just refer to the part under the square root within the if statement like so:
AT = sqrt(s.*(s-a).*(s-b).*(s-c))
if s.*(s-a).*(s-b).*(s-c) < 0
AT = sqrt(s.*(-1.*((s-a).*(s-b).*(s-c))))
end
%The new issue is that sometimes I get back a triangle with an area of 0.
%hmm.. Ok - the 0 case is when a = 20, b = 24, and c = 4. Matlab does this
%math: sqrt(24.*(4).*(0).*(16)) = 0

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

採用された回答

Chris
Chris 2023 年 12 月 1 日
You can take the absolute value of each difference:
AT = sqrt(s.*abs(s-a).*abs(s-b).*abs(s-c));
  6 件のコメント
Paul
Paul 2023 年 12 月 3 日
Taking the absolute value of the radicand will lead to incorrect results if the inputs for the "sides" can't be the sides of an actual triangle. The much better approach would be to error check the inputs first using the criterion in @Dyuman Joshi's comment, and then use Heron's fomula only if the inputs define a valid triangle.
Also, there may be interest in this Wikipedia link.
Dyuman Joshi
Dyuman Joshi 2023 年 12 月 4 日
@Paul, that is interesting!

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

その他の回答 (0 件)

カテゴリ

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

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by