Functieniveaulijnen online definiëren en construeren. Een eenvoudige klasse voor het plotten van niveaulijnen van een 2D-rasterfunctie

Als elk punt X = (x 1, x 2, ... x n) uit de verzameling (X) punten van de n-dimensionale ruimte geassocieerd is met één goed gedefinieerde waarde van de variabele z, dan zeggen ze dat de gegeven functie van n variabelen z = f(x 1, x 2, ...x n) = f (X).

In dit geval worden de variabelen x 1, x 2, ... x n aangeroepen onafhankelijke variabelen of argumenten functies, z - afhankelijke variabele, en het symbool f geeft aan correspondentierecht. De verzameling (X) wordt aangeroepen domein van definitie functies (dit is een bepaalde subset van n-dimensionale ruimte).

De functie z = 1/(x 1 x 2) is bijvoorbeeld een functie van twee variabelen. De argumenten zijn de variabelen x 1 en x 2, en z is de afhankelijke variabele. Het definitiedomein is het gehele coördinatenvlak, met uitzondering van de rechte lijnen x 1 = 0 en x 2 = 0, d.w.z. zonder x- en ordinaat-assen. Het vervangen van elk punt uit het definitiedomein in de functie, volgens de correspondentiewet die we verkrijgen bepaald aantal. Neem bijvoorbeeld het punt (2; 5), d.w.z. x 1 = 2, x 2 = 5, krijgen we
z = 1/(2*5) = 0,1 (dat wil zeggen z(2; 5) = 0,1).

Een functie van de vorm z = a 1 x 1 + a 2 x 2 + ... + a n x n + b, waarbij a 1, a 2,..., en n, b constante getallen zijn, heet lineair. Het kan worden beschouwd als de som van n lineaire functies van de variabelen x 1, x 2, ... x n. Alle andere functies worden aangeroepen niet-lineair.

De functie z = 1/(x 1 x 2) is bijvoorbeeld niet-lineair, en de functie z =
= x 1 + 7x 2 - 5 – lineair.

Elke functie z = f (X) = f(x 1, x 2, ... x n) kan worden geassocieerd met n functies van één variabele als we de waarden van alle variabelen behalve één vastleggen.

Functies van drie variabelen z = 1/(x 1 x 2 x 3) kunnen bijvoorbeeld worden geassocieerd met drie functies van één variabele. Als we x 2 = a en x 3 = b vaststellen, zal de functie de vorm aannemen z = 1/(abx 1); als we x 1 = a en x 3 = b vaststellen, dan zal het de vorm aannemen z = 1/(abx 2); als we x 1 = a en x 2 = b vaststellen, dan zal het de vorm aannemen z = 1/(abx 3). IN in dit geval alle drie de functies hebben dezelfde vorm. Dat is niet altijd zo. Als we bijvoorbeeld voor een functie van twee variabelen x 2 = a vaststellen, dan zal deze de vorm aannemen z = 5x 1 a, d.w.z. machtsfunctie, en als we x 1 = a vaststellen, dan zal deze de vorm aannemen, d.w.z. exponentiële functie.

Schema functie van twee variabelen z = f(x, y) is de verzameling punten in de driedimensionale ruimte (x, y, z), waarvan de toepassing z gerelateerd is aan de abscis x en ordinaat y door een functionele relatie
z = f(x, y). Deze grafiek vertegenwoordigt een oppervlak in de driedimensionale ruimte (bijvoorbeeld zoals in figuur 5.3).

Er kan worden bewezen dat als een functie lineair is (dat wil zeggen z = ax + by + c), de grafiek ervan een vlak is in de driedimensionale ruimte. Andere voorbeelden 3D-grafieken Het wordt aanbevolen om zelfstandig te studeren met behulp van het leerboek van Kremer (pp. 405-406).

Als er meer dan twee variabelen zijn (n variabelen), dan schema functie is een verzameling punten in de (n+1)-dimensionale ruimte waarvoor de x-coördinaat n+1 wordt berekend in overeenstemming met een gegeven functionele wet. Zo’n grafiek heet hyperoppervlak(Voor lineaire functiehypervlak), en het vertegenwoordigt ook een wetenschappelijke abstractie (het is onmogelijk om het weer te geven).

Figuur 5.3 – Grafiek van een functie van twee variabelen in een driedimensionale ruimte

Vlak oppervlak een functie van n variabelen is een verzameling punten in de n-dimensionale ruimte, zodanig dat op al deze punten de waarde van de functie hetzelfde is en gelijk is aan C. Het getal C zelf wordt in dit geval genoemd niveau.

Meestal is het voor dezelfde functie mogelijk om een ​​oneindig aantal vlakke oppervlakken te construeren (overeenkomend met verschillende niveaus).

Voor een functie van twee variabelen neemt het vlakke oppervlak de vorm aan vlakke lijnen.

Beschouw bijvoorbeeld z = 1/(x 1 x 2). Laten we C = 10 nemen, d.w.z. 1/(x 1 x 2) = 10. Dan x 2 = 1/(10x 1), d.w.z. in het vlak zal de waterpaslijn de vorm aannemen zoals weergegeven in Figuur 5.4 als een ononderbroken lijn. Als we een ander niveau nemen, bijvoorbeeld C = 5, verkrijgen we de niveaulijn in de vorm van een grafiek met de functie x 2 = 1/(5x 1) (weergegeven met een stippellijn in figuur 5.4).

Figuur 5.4 - Functieniveaulijnen z = 1/(x 1 x 2)

Laten we naar een ander voorbeeld kijken. Stel z = 2x 1 + x 2. Laten we C = 2 nemen, d.w.z. 2x 1 + x 2 = 2. Dan x 2 = 2 - 2x 1, d.w.z. op het vlak zal de waterpaslijn de vorm aannemen van een rechte lijn, weergegeven in Figuur 5.5 door een ononderbroken lijn. Als we een ander niveau nemen, bijvoorbeeld C = 4, krijgen we een niveaulijn in de vorm van een rechte lijn x 2 = 4 - 2x 1 (weergegeven met een stippellijn in Figuur 5.5). De niveaulijn voor 2x 1 + x 2 = 3 wordt in Figuur 5.5 weergegeven als een stippellijn.

Het is gemakkelijk te verifiëren dat voor een lineaire functie van twee variabelen elke niveaulijn een rechte lijn in het vlak zal zijn, en dat alle niveaulijnen evenwijdig aan elkaar zullen zijn.

Figuur 5.5 - Functieniveaulijnen z = 2x 1 + x 2

Een functie van verschillende variabelen definiëren

Bij het beschouwen van functies van één variabele wezen we erop dat bij het bestuderen van veel verschijnselen men functies van twee of meer onafhankelijke variabelen tegenkomt. Laten we een paar voorbeelden geven.

Voorbeeld 1. Vierkant S rechthoek met zijden waarvan de lengtes gelijk zijn X En bij, wordt uitgedrukt door de formule S = xy. Elk paar waarden X En bij komt overeen met een bepaalde gebiedswaarde S; S is een functie van twee variabelen.

Voorbeeld 2. Volume V rechthoekig parallellepipedum met randen waarvan de lengtes gelijk zijn X, bij, z, wordt uitgedrukt door de formule V= xyz. Hier V er is een functie van drie variabelen X, bij, z.

Voorbeeld 3. Bereik R vlucht van projectielen afgevuurd op initiële snelheid v 0 van een pistool waarvan de loop onder een hoek  ten opzichte van de horizontaal helt, wordt uitgedrukt door de formule
(als we de luchtweerstand verwaarlozen). Hier G– versnelling van de zwaartekracht. Voor elk paar waarden v 0 en  deze formule geeft een bepaalde waarde R, d.w.z. R is een functie van twee variabelen v 0 en .

Voorbeeld 4.
. Hier En er is een functie van vier variabelen X, bij, z, T.

Definitie 1. Als elk paar ( X, bij) waarden van twee variabelen die onafhankelijk van elkaar zijn X En bij uit een bepaald gebied van hun verandering D, komt overeen met een bepaalde waarde van de hoeveelheid z, dan zeggen wij dat z er is een functie twee onafhankelijke variabelen x En bij, gedefinieerd in het gebied D.

Symbolisch wordt een functie van twee variabelen als volgt aangegeven:

z= F(X, j), z = F(X, j) enz.

Een functie van twee variabelen kan bijvoorbeeld worden gespecificeerd met behulp van een tabel of analytisch - met behulp van een formule, zoals werd gedaan in de hierboven besproken voorbeelden. Op basis van de formule kunt u een tabel met functiewaarden maken voor sommige waardenparen van onafhankelijke variabelen. Voor het eerste voorbeeld kunt u dus de volgende tabel maken:

S = xy

In deze tabel, op het snijpunt van een rij en een kolom die overeenkomt met bepaalde waarden X En bij, wordt de bijbehorende functiewaarde ingevoerd S. Als functionele afhankelijkheid z= F(X, j) wordt verkregen als resultaat van metingen van de hoeveelheid z Bij het experimenteel bestuderen van een fenomeen wordt onmiddellijk een tabel verkregen die bepalend is z als functie van twee variabelen. In dit geval wordt de functie alleen door de tabel gespecificeerd.

Net als in het geval van één onafhankelijke variabele bestaat er in het algemeen voor geen enkele waarde een functie van twee variabelen X En bij.

Definitie 2. Een set paren ( X, bij) waarden X En bij, waarbij de functie wordt bepaald z= F(X, j), genaamd domein van definitie of bestaansgebied deze functie.

Het domein van de definitie van een functie wordt duidelijk geometrisch geïllustreerd. Als elk paar waarden X En bij we zullen het weergeven met een punt M(X, bij) in het vliegtuig Ohoo, dan zal het definitiedomein van de functie worden afgebeeld als een bepaalde verzameling punten op het vlak. We zullen deze verzameling punten ook het domein van de definitie van de functie noemen. In het bijzonder kan het definitiedomein het hele vlak bestrijken. In wat volgt zullen we ons vooral bezighouden met gebieden die representatief zijn delen van het vliegtuig, begrensd door lijnen. De grenslijn dit gebied, wij bellen grens gebieden. Punten van de regio die niet op de grens liggen, worden opgeroepen intern punten van het gebied. Er wordt een gebied genoemd dat alleen uit binnenpunten bestaat open of open. Als de grenspunten ook tot de regio behoren, wordt de regio aangeroepen gesloten. Een gebied wordt begrensd genoemd als er zo'n constante is MET, dat is de afstand van elk punt M gebied vanaf de oorsprong OVER minder MET, d.w.z. | OM| < MET.

Voorbeeld 5. Bepaal het natuurlijke domein van een functie

z = 2Xbij.

Analytische uitdrukking 2 Xbij is logisch voor elke waarde X En bij. Bijgevolg is het natuurlijke domein van de definitie van de functie het hele vlak Ohoo.

Voorbeeld 6.
.

Om te z een reële waarde heeft, is het noodzakelijk dat er een niet-negatief getal onder de wortel staat, d.w.z. X En bij moet voldoen aan de ongelijkheid 1 – X 2 – bij 2  0, of X 2 + bij 2  1.

Alle punten M(X, bij), waarvan de coördinaten voldoen aan de aangegeven ongelijkheid, liggen in een cirkel met straal 1 met een middelpunt in de oorsprong en op de grens van deze cirkel.

Voorbeeld 7.
.

Omdat logaritmen alleen zijn gedefinieerd voor positieve cijfers, dan moet aan de ongelijkheid worden voldaan X + bij> 0, of bij >  X.

Dit betekent dat het domein van de definitie van de functie z is de helft van het vlak boven de lijn bij =  X, exclusief de rechte lijn zelf.

Voorbeeld 8. Oppervlakte van een driehoek S vertegenwoordigt de basisfunctie X en hoogten bij: S= xy/2.

Het domein van definitie van deze functie is het domein X  0, bij 0 (aangezien de basis van een driehoek en de hoogte ervan noch negatief noch nul kunnen zijn). Merk op dat het definitiedomein van de betreffende functie niet samenvalt met het natuurlijke definitiedomein van de analytische uitdrukking waarmee de functie is gespecificeerd, aangezien het natuurlijke definitiedomein van de uitdrukking xy/ 2 is duidelijk het hele vlak Ohoo.

De definitie van een functie van twee variabelen kan gemakkelijk worden gegeneraliseerd naar het geval van drie of meer variabelen.

Definitie 3. Als elke beschouwde reeks variabele waarden X, bij, z, …, u, T komt overeen met een bepaalde variabele waarde w, dan bellen wij w functie van onafhankelijke variabelen X, bij, z, …, u, T en schrijf w= F(X, bij, z, …, u, T) of w= F(X, bij, z, …, u, T) enzovoort.

Net zoals voor een functie van twee variabelen, kunnen we spreken over het domein van de definitie van een functie van drie, vier of meer variabelen.

Dus bijvoorbeeld voor de functie van drie variabel gebied De definitie is een bepaalde verzameling drievoudige getallen ( X, bij, z). Laten we meteen opmerken dat elk drietal getallen een bepaald punt definieert M(X, bij, z) in de ruimte Ohooz. Bijgevolg is het domein van de definitie van een functie van drie variabelen een bepaald stel punten in de ruimte.

Op dezelfde manier kunnen we praten over het domein van de definitie van een functie van vier variabelen u= F(X, j, z, T) als over een verzameling viervouden van getallen ( X, j, z, T). Het domein van de definitie van een functie van vier of meer variabelen laten geen eenvoudige geometrische interpretatie meer toe.

Voorbeeld 2 toont een functie van drie variabelen die voor alle waarden zijn gedefinieerd X, bij, z.

Voorbeeld 4 toont een functie van vier variabelen.

Voorbeeld 9. .

Hier w– functie van vier variabelen X, bij, z, En, gedefinieerd met waarden van variabelen die voldoen aan de relatie:

Concept van een functie van verschillende variabelen

Laten we het concept van een functie van verschillende variabelen introduceren.

Definitie 1. Laat elk punt M uit een reeks punten ( M) Euclidische ruimte EM volgens een bepaalde wet wordt een bepaald aantal in overeenstemming gebracht En uit een numerieke verzameling U. Dan zullen we dat op de set zeggen ( M) functie wordt gegeven en =f(M). Bovendien zijn de sets ( M) En U worden respectievelijk het domein van de definitie (toewijzing) en het domein van de verandering van de functie genoemd f(M).

Zoals je weet, een functie van één variabele bij = F(X) wordt in het vlak weergegeven als een lijn. In het geval van twee variabelen is het definitiedomein ( M P) functies z = f(x, y) vertegenwoordigt een reeks punten op het coördinatenvlak Ohoo(Afb. 8.1). Coördineren z genaamd toepassen, en vervolgens wordt de functie zelf afgebeeld als een oppervlak in de ruimte E3 . Op dezelfde manier is de functie van T variabelen

gedefinieerd op de set ( M) Euclidische ruimte EM, vertegenwoordigt een hyperoppervlak in de Euclidische ruimte Em+1.

Sommige soorten functies van verschillende variabelen

Laten we voorbeelden bekijken van functies van verschillende variabelen en hun definitiedomeinen vinden.

E3 . Het definitiedomein van deze functie is de gehele reeks punten van het vlak Oeh. Het bereik van deze functie is het interval X; privé dubbel[,] Y; privé dubbel[,] Z; // Lijst met openbare isolijnenlijst Lijnen ( ophalen; instellen; ) ///

/// Voorbereiding /// /// Reeks niveaus /// Coördinaten van X-gebied /// Y-coördinaten van het gebied /// Rasterfunctie public LinesOfLevels(double _levels, double[,] _x, double[,] _y, double[,] _z) ( Lines = nieuwe lijst (_levels.Count()); foreach (dubbele l in _levels) ( Lines.Add(new LineLevel(l)); ) X = _x; Y = _y; Z = _z; J = X.GetLengte(0); K = X.GetLengte(1); ) /// /// Berekening van isolijnen. /// public void Calculate() ( for (int j = 0; j< J - 1; j++) for (int k = 0; k < K - 1; k++) { Ceil ir = new Ceil(j, k, X, Y, Z); for (int l = 0; l < Lines.Count(); l++) ir.AddIntoLineLevel(Lines[l]); } } } /// /// Eén isolijn /// public class LineLevel ( // Lijst met isolijnpunten in de vorm van puntenparen // behorend tot dezelfde vierhoekige cel public List Paren ( get; set; ) // Isolineniveau openbaar dubbel niveau ( get; set; ) openbaar LineLevel(double _level) ( Niveau = _niveau; Paren = nieuwe lijst (); } } /// /// Een paar isolijnpunten die tot dezelfde cel behoren /// openbare klasse PairOfPoints ( openbare lijst Punten ( get; set; ) public PairOfPoints() ( Punten = nieuwe lijst (); } } /// /// Celhoek. /// Indices voor het definiëren van één hoek van een vierzijdige cel /// interne struct Dot ( interne int j ( get; set; ) internal int k ( get; set; ) interne Dot(int _j, int _k) ( j = _j; k = _k; ) ) /// /// Vierhoekige rastercel. Bepaalt de huidige cel. /// Berekent isolijnsegmenten in een cel /// interne klasse Ceil ( // Celhoeken privé Punt d = nieuwe Punt; // Coördinatiepunten van hoeken privé Punt r = nieuw Punt; // Arrays van coördinaten van het gehele gebied privé dubbel[,] X; privé dubbel[,] Y ; // Array rasterfunctie privé dubbel[,] Z; /// /// Celdefinitie /// Gedefinieerd door de linker benedenhoek. Lussen voor het zoeken naar indexen moeten 1 kleiner zijn dan de afmetingen J,K-arrays /// /// j - index van de linker benedenhoek /// k - index van de linker benedenhoek /// Array X /// Array Y /// Rasterfunctiearray Z interne Ceil(int _j, int _k, double[,] _x, double[,] _y, double[,] _z) ( d = nieuwe punt(_j, _k); d = nieuwe punt(_j + 1, _k); d = nieuwe Punt(_j + 1, _k + 1); r = puntPunt(d); /// Bepaling van het coördinaatpunt Punt van de hoek /// /// Hoek gedefinieerd door puntstructuur /// private Point dotPoint(Dot _d) (return new Point(X[_d.j, _d.k], Y[_d.j, _d.k]); ) /// /// Definitie van een functie onder een gegeven hoek /// /// Hoek gedefinieerd door puntstructuur /// privé dubbele puntZ(Punt _d) ( return Z[_d.j, _d.k]; ) /// /// Een paar punten definiëren waar de waterpaslijn doorheen gaat. /// Punten op de celgrenzen worden bepaald door lineaire interpolatie. /// /// Functieniveauwaarde /// private PairOfPoints ByLevel(double _l) ( PairOfPoints p = new PairOfPoints(); // Edge 0 if ((dotZ(d) >= _l && dotZ(d)< _l) || (dotZ(d) >_l && puntZ(d)<= _l)) { double t = (_l - dotZ(d)) / (dotZ(d) - dotZ(d)); double x = r.X * t + r.X * (1 - t); double y = r.Y * t + r.Y * (1 - t); p.Points.Add(new Point(x, y)); } // Ребро 1 if ((dotZ(d) >= _l && puntZ(d)< _l) || (dotZ(d) >_l && puntZ(d)<= _l)) { double t = (_l - dotZ(d)) / (dotZ(d) - dotZ(d)); double x = r.X * t + r.X * (1 - t); double y = r.Y * t + r.Y * (1 - t); p.Points.Add(new Point(x, y)); if (p.Points.Count == 2) return p; } // Ребро 2 if ((dotZ(d) >= _l && puntZ(d)< _l) || (dotZ(d) >_l && puntZ(d)<= _l)) { double t = (_l - dotZ(d)) / (dotZ(d) - dotZ(d)); double x = r.X * t + r.X * (1 - t); double y = r.Y * t + r.Y * (1 - t); p.Points.Add(new Point(x, y)); if (p.Points.Count == 2) return p; } // Ребро 3 if ((dotZ(d) >= _l && puntZ(d)< _l) || (dotZ(d) >_l && puntZ(d)<= _l)) { double t = (_l - dotZ(d)) / (dotZ(d) - dotZ(d)); double x = r.X * t + r.X * (1 - t); double y = r.Y * t + r.Y * (1 - t); p.Points.Add(new Point(x, y)); } return p; } /// /// Een paar punten toevoegen aan de vergelijkingslijn /// /// Niveau lijn interne leegte AddIntoLineLevel(LineLevel _lL) ( PairOfPoints lp = ByLevel(_lL.Level); if (lp.Points.Count > 0) _lL.Pairs.Add(lp); ) ) )
Om het werk van de klas te demonstreren, een kleine testtoepassing WPF, dat niveaulijnen bouwt voor een functie van de vorm: z = x^2 + y^2 op een raster van 10 bij 10.

MainWindow.xaml-bestand:


En het MainWindow.xaml.cs-codebestand:

System.Linq gebruiken; met behulp van System.Windows; met behulp van System.Windows.Controls; met behulp van System.Windows.Media; met behulp van System.Windows.Shapes; naamruimte WpfLinesLevels ( ///

/// Interactielogica voor MainWindow.xaml /// public gedeeltelijke klasse MainWindow: Window ( private double Xmax; private double Xmin; private double Ymax; private double Ymin; private double xSt; private double ySt; public MainWindow() ( InitializeComponent(); // De niveaus definiëren die dubbel worden weergegeven niveaus = ( 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ); dubbel[,] X = nieuw dubbel[,] Y = nieuw dubbel[,] Z = nieuw dubbel; ; // Variabelen voor het converteren van fysieke coördinaten naar schermcoördinaten Xmin = 0; Ymin = 0; xSt = 525 / (Xmax - Xmin);< 10; k++) for (int j = 0; j < 10; j++) { X = j; Y = k; Z = j * j + k * k; } // Создание изолиний LinesOfLevels lol = new LinesOfLevels(levels, X, Y, Z); // Их расчет lol.Calculate(); // Построение DrowLevelLine(lol, X, Y); } /// /// Methode voor het construeren van isolijnen /// /// Berekend object met isolijnen /// reeks X-coördinaten /// reeks Y-coördinaten private void DrowLevelLine(LinesOfLevels lL, double[,] x, double[,] y) ( Canvas can = new Canvas(); foreach (LineLevel l in lL.Lines) ( foreach (PairOfPoints pp in l.Pairs) ( if ( pp.Points.Count() == 2) ( Lijn pl = nieuwe lijn(); pl.Stroke = nieuwe SolidColorBrush(Colors.BlueViolet); pl.X1 = xCalc(pp.Points.X); pl.X2 = xCalc (pp.Punten.X); pl.Y1 = yCalc(pp.Punten.Y); pl.Y2 = yCalc(pp.Punten.Y); kan.Kinderen.Toevoegen(pl) ) kan.Marge( 10, 10, 10, 10); can.VerticalAlignment = VerticalAlignment.Stretch; can.HorizontalAlignment = HorizontalAlignment.Stretch; /// De fysieke coördinaat X omzetten naar de schermcoördinaat /// /// Fysieke coördinaat X /// Scherm X-coördinaat privé dubbel xCalc(dubbel _x) ( return xSt * (_x - Xmin); ) /// /// De fysieke Y-coördinaat omzetten naar de schermcoördinaat /// /// Fysieke coördinaat Y /// Scherm Y-coördinaat private double yCalc(double _y) ( return ySt * (Ymax - _y); ) ) )
Het resultaat van het testvoorbeeld wordt weergegeven in de figuur.