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

조회 수: 1 (최근 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.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Programming에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by