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

5 次查看（过去 30 天）
Julian 2023-12-1
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 个评论显示 -1更早的评论隐藏 -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 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 个评论显示 4更早的评论隐藏 4更早的评论
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 2023-12-4
@Paul, that is interesting!

### 类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

R2023b

### Community Treasure Hunt

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

Start Hunting!

Translated by