Poissons Equation with Point source

Hello everyone :)
in matlab´s Example "Poisson's Equation with Point Source and Adaptive Mesh Refinement" ist a function "circlef" mentioned, that create the point source by returning 1/area for the triangle that contains the origin and zero elsewhere. How do I create such a funtion? Meaning how can I define f differently on specific traingles in the mesh?
Thanks in advance
Hannah

2 Kommentare

Dyuman Joshi
Dyuman Joshi am 7 Feb. 2024
"How do I create such a funtion?"
Use the description given as its definition.
"Meaning how can I define f differently on specific traingles in the mesh?"
Use if, elseif, else conditions.
Hannah Burmester
Hannah Burmester am 7 Feb. 2024
Thanks you for your reply. Yes I thought of something like
if (0,0) in triangle
f = 1/area(triangle)
else
f = 0
end
But how can I translate that into code?

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Dyuman Joshi
Dyuman Joshi am 7 Feb. 2024

0 Stimmen

You can use inpolygon to see if the origin is inside the triangle or not and polyarea to calculate the area of the triangle -
Note - inpolygon() also considers the points that lie ON the edges of the polygon (see the case below).
x = [-2 -1 1];
y = [-2 1 -1];
plot(polyshape(x,y))
hold on
plot(0, 0, '.r', 'MarkerSize', 10)
if inpolygon(0, 0, x, y)
f = 1./polyarea(x,y);
else
f = 0;
end
f
f = 0.2500
This can be condensed to -
F = inpolygon(0, 0, x, y)./polyarea(x,y)
F = 0.2500

5 Kommentare

If the criteria you use does not involve the points ON the edge to be counted, use this -
x = [-2 -1 1];
y = [-2 1 -1];
[in,on] = inpolygon(0, 0, x, y)
in = logical
1
on = logical
1
if in & ~on
f = 1./polyarea(x,y);
else
f = 0;
end
f
f = 0
Which, again, can be condensed to -
F = (in & ~on)./polyarea(x,y)
F = 0
Dyuman Joshi
Dyuman Joshi am 12 Feb. 2024
Any updates, @Hannah Burmester?
I'd simply edit the mentionned MATLAB function:
edit circlef
Isn't that possible ?
Hannah Burmester
Hannah Burmester am 12 Feb. 2024
Thank you all for your replays! Editing the matlab function should work.
Dyuman Joshi
Dyuman Joshi am 12 Feb. 2024
Bearbeitet: Dyuman Joshi am 17 Feb. 2024
From a cursory glance, I'd say my solution is simpler than whatever is being done here -
type circlef.m
function f=circlef(p,t,u,time) %point source at (0,0) % Copyright 1994-2001 The MathWorks, Inc. x=0; y=0; np=size(p,2); nt=size(t,2); [ar,t1,t2,t3]=pdetrg(p,t); [t1,tn,t2,t3]=tri2grid(p,t,zeros(np,1),x,y); f=zeros(1,nt); if ~isnan(tn) f(tn)=1/ar(tn); end

Melden Sie sich an, um zu kommentieren.

Produkte

Version

R2023a

Gefragt:

am 7 Feb. 2024

Bearbeitet:

am 17 Feb. 2024

Community Treasure Hunt

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

Start Hunting!

Translated by