AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Iterationsproblem

Ein Thema von Bjoerk · begonnen am 8. Dez 2012 · letzter Beitrag vom 9. Dez 2012
Antwort Antwort
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#1

Iterationsproblem

  Alt 8. Dez 2012, 13:34
Ich hann folschendes Iterationsproblem (Skizze Siehe Anlage). Es soll eine Fläche A gefunden werden, die gewisse Kriterien erfüllt.

Vorgabe ist ein Rechteck b * d sowie eine Belastung Nx, My und Mz.

Das Koordinatensystem x,y,z befindet sich im Schwerpunkt des Querschnitts b * d.

In Richtung der x-Achse drückt jemand (Kraft Nx), an den beiden anderen Achsen drehen welche (Momente My, Mz).

Der Querschnitt soll keine Zugspannungen aufnehmen können, d. h. der Querschnitt reißt auf und es stellt sich eine Fläche A ein, deren Flächeninhalt gleich Nx ist (In Wirklichkeit ein räumlicher Spannungspolyeder, hier aber wurscht).

Damit die Fläche A auch die Momente My und Mz im Gleichgewicht halten kann, muß sie sich wie folgt einstellen (S = Schwerpunkt der Fläche A):
Delphi-Quellcode:
repeat
  A := GetA .. // ??
  S:= GetSchwerpunkt(A);
  C:= GetC; // Konstante
until (A * C = NX) and (A * C * S.y = Mz) and (A * C * S.z = My);
Ich hab das mal vor 20 Jahren mit einer doppelten Repeat Schleife programmiert, kann diese procedure (1000 Zeilen) aber beim besten Willen nicht mehr nachvollziehen.

Anybody?

Crosspost
Angehängte Dateien
Dateityp: pdf A.pdf (53,7 KB, 29x aufgerufen)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Iterationsproblem

  Alt 8. Dez 2012, 17:25
Falls es jemand konkret durchspielen möchte, folgender Record berechnet die Fläche und den Schwerpunkt:

Delphi-Quellcode:
unit uNEck; // (c) 28.04.1985, 2.05.2012 Thomas Abel, Edgar Zocher

interface

const
  MaxFloatPoints = 100;

type
  TFloatPoint = record
    X, Y: double;
  end;
  TFloatPoints = array [0..MaxFloatPoints - 1] of TFloatPoint;
  TNEck = record
  private
    FCount: integer; // Anzahl der Eckpunkte
    FPoints: TFloatPoints;
    function Determinante(const I: integer): double;
    function GetPoint(Index: integer): TFloatPoint;
    procedure SetPoint(const Index: integer; const X, Y: double);
    function NextPointNumber(const Index: integer): integer;
  public
    procedure Clear;
    procedure AddPoint(const X, Y: double); overload;
    procedure AddPoint(const Index: integer); overload;
    procedure DelPoint(const Index: integer);
    procedure InsPoint(const Index: integer; const X, Y: double);
    function Schwerpunkt: TFloatPoint;
    function Flaeche: double;
    property Points[Index: integer]: TFloatPoint read GetPoint;
    property Count: integer read FCount;
  end;

implementation

function TNEck.GetPoint(Index: integer): TFloatPoint;
begin
  Result := FPoints[Index];
end;

procedure TNEck.SetPoint(const Index: integer; const X, Y: double);
begin
  FPoints[Index].X := X;
  FPoints[Index].Y := Y;
end;

procedure TNEck.AddPoint(const X, Y: double);
begin
  Inc(FCount);
  SetPoint(FCount - 1, X, Y);
end;

procedure TNEck.AddPoint(const Index: integer);
begin
  AddPoint(FPoints[Index].X, FPoints[Index].Y);
end;

procedure TNEck.DelPoint(const Index: integer);
var
  I: integer;
begin
  for I := Index to FCount - 2 do
    FPoints[I] := FPoints[I + 1];
  Dec(FCount);
end;

procedure TNEck.InsPoint(const Index: integer; const X, Y: double);
var
  I: integer;
begin
  Inc(FCount);
  for I := FCount - 1 downto Index + 1 do
    FPoints[I] := FPoints[I - 1];
  SetPoint(Index, X, Y)
end;

function TNEck.NextPointNumber(const Index: integer): integer;
begin
  if Index = FCount - 1 then
    Result := 0
  else
    Result := Index + 1;
end;

function TNEck.Determinante(const I: integer): double;
var
  J: integer;
begin
  J := NextPointNumber(I);
  Result := FPoints[I].X * FPoints[J].Y - FPoints[I].Y * FPoints[J].X;
end;

function TNEck.Flaeche: double;
var
  I: integer;
begin
  Result := 0;
  for I := 0 to FCount - 1 do
    Result := Result + Determinante(I) / 2;
end;

function TNEck.Schwerpunkt: TFloatPoint;
var
  I, J: integer;
  M1, M2: double;
begin
  M1 := 0;
  M2 := 0;
  for I := 0 to FCount - 1 do
  begin
    J := NextPointNumber(I);
    M1 := M1 + (FPoints[I].X + FPoints[J].X) * Determinante(I) / 6;
    M2 := M2 + (FPoints[I].Y + FPoints[J].Y) * Determinante(I) / 6;
  end;
  Result.X := M1 / Flaeche;
  Result.Y := M2 / Flaeche;
end;

procedure TNEck.Clear;
begin
  FCount := 0;
end;

end.
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#3

AW: Iterationsproblem

  Alt 8. Dez 2012, 17:30
Booh, Statik.
Du willst das A jetzt bei jeder Iteration verändern, so dass irgendwann alle 3 Bedingungen gültig sind? Dafür mußt Du doch irgendwelche Kriterien haben, damit das Ganze konvergieren kann.
Aus meiner Sicht fehlt noch irgendwas für A.

Gruss Jens

Mich würde ja Dein ursprünglicher Code interessieren

Edit: Habe Deinen 2. Post eben erst gesehen...
Also so soll die Fläche ermittelt werden. Willst Du jetzt irgendwelche Flächen ausprobieren, bis die 3 Bedingungen stimmen? Da fehlt noch was. So ist es ein einfaches Durchprobieren, das fast unendlich wird.
Achtung: Bin kein Informatiker sondern komme vom Bau.

Geändert von Jens01 ( 8. Dez 2012 um 17:40 Uhr)
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#4

AW: Iterationsproblem

  Alt 8. Dez 2012, 18:16
Habe gerade geguckt.
Wenn es sich um Kernweiten handelt -und ich nicht ganz falsch liege- dann hängt die Form für diesen spannungsfreien Bereich von der Form des Bauteils ab. Bei so einem Rechteck ist da ja so ein Karo. Das Ding könnte man wahrscheinlich verändern und dann nach den Kriterien abprüfen.
Gruss Jens
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Iterationsproblem

  Alt 8. Dez 2012, 18:34
Hi Jens,

Ja, es gibt dann eine Lösung, sofern S innerhalb der zweiten Kernfläche liegt. Das ist ja der Kippnachweis, der zum Beispiel bei einem Einzelfundament zu führen ist. Bei einer Stahlbetonbemessung macht man auch nichts anderes, nur daß der Stahl hier eventuelle Zugkräfte aufnimmt, es also keine Beschränkung auf irgendwelche Kernweiten gibt.

Den Code kann ich leider nicht veröffentlichen, erstens zu peinlich und zweites Betriebsinterna.

Ich will aber eigentlich nicht fachsimpeln. Mir geht es darum, ob jemand dem Dingen ansieht, "ah, das könnte eine doppelte Newton Iteration werden" oder "mit XY funktionieren".

Gruß
Thomas
  Mit Zitat antworten Zitat
Jens01

Registriert seit: 14. Apr 2009
673 Beiträge
 
#6

AW: Iterationsproblem

  Alt 8. Dez 2012, 18:50
Mir gings nicht ums Fachliche. Bin nur der Meinung, dass noch Kriterien für eine Iteration fehlen, die ich mit meinem vorhergehenden Post erörtern wollte. Ich mag aber auch völlig falsch liegen...

Zitat:
Den Code kann ich leider nicht veröffentlichen, erstens zu peinlich und zweites Betriebsinterna.
Schade, man kann ja mal fragen
Achtung: Bin kein Informatiker sondern komme vom Bau.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Iterationsproblem

  Alt 9. Dez 2012, 16:33
Ich weiß jetzt wieder, wie ich’s damals gemacht habe. Oh Mann, eh.

Wie wir schon sagten, es gibt eine Lösung, wenn Nx < 0 und (My/Nx/d)^2 + (Mz/Nx/b)^2 <= 1/9

Am Anfang hat man A = b*d. Dann berechnet man in den Eckpunkten die Spannungen. Wechselt in 2 betrachteten Punkten das Vorzeichen, dann berechnet man den Nullpunkt der Line zwischen diesen beiden Punkten und das ist dann ein korrigierter Eckpunkt der Fläche. Abbruchkriterium ist, wenn sich die Koordinaten der Punkte der Fläche nicht mehr ändern.

Kleiner Ausschnitt aus’m Katastrophencode:

Punkte sind array [1..2, 1..Count]

Delphi-Quellcode:
  J:= 1;
  for K:= 1 to CountAlt do
  begin
    if K = CountAlt then
      I:= 1
    else
      I:= K + 1;
    if Sigma[K] <= 0 then
    begin
      PNeu[1, J]:= P[1, K];
      PNeu[2, J]:= P[2, K];
      Inc(J);
    end;
    if (Sigma[K] * Sigma[I]) < 0 then
    begin
      PNeu[1, J]:= P[1, K] + Sigma[K] * (P[1, I] - P[1, K]) / (Sigma[K] - Sigma[I]);
      PNeu[2, J]:= P[2, K] + Sigma[K] * (P[2, I] - P[2, K]) / (Sigma[K] - Sigma[I]);
      Inc(J);
    end;
  end;
  CountNeu:= J;
Da Spannungen immer bezüglich Xsi/Eta berechnet werden müssen, ist das eine blöde Transponiererei von X/Y nach jeweils Xsi/Eta, das ist alles.

Alles?

Wirklich alles?

Ich fürchte nicht, ich hab' jetzt aber erst mal keinen Bock mehr..

Gruß und schönen Sonntag

Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz