ძირითადი მასალა
კომპიუტერული პროგრამირება
კურსი: კომპიუტერული პროგრამირება > თემა 5
გაკვეთილი 7: ოსცილაცია (სხვაობა)- რყევის (ოსცილაციის) ამპლიტუდა და პერიოდი
- გამოწვევა: ცისარტყელას სპირალი
- ოსცილაცია კუთხური ვექტორით
- გამოწვევა: კოსმოსური ხომალდის მართვა
- ტალღები
- გამოწვევა: ბევრი ტალღა
- ტრიგონომეტრია და ძალები: ქანქარა
- გამოწვევა: ქანქარა თოჯინა
- გაზაფხულის ძალები
- პროექტი: მცოცავი, მხოხავი, მბრუნავი ქმნილებები
© 2023 Khan Academyგამოყენების პირობებიკონფიდენციალურობის პოლიტიკაშენიშვნა ქუქი-ჩანაწერებზე
ტრიგონომეტრია და ძალები: ქანქარა
გახსოვთ ნიუტონის მოძრაობის კანონები, რომლებიც რამდენიმე სექციის წინ ვისწავლეთ? მაშინ ეს კანონები გამოვიყენეთ ობიექტის აჩქარების გამოსათვლელად, რათა გამოგვეანგარიშებინა და დაგვეხატა მისი ახალი ადგილმდებარეობა სამყაროში. ახლა ამ კანონებს გამოვიყენებთ ქანქარის აჩქარების გამოსათვლელად, რათა ვიპოვოთ და დავხატოთ მისი ადგილმდებარეობა რხევის გაყოლებაზე. როგორც ჩანს, ამისათვის ტრიგონომეტრიის დახმარება დაგვჭირდება.
ქანქარა არის ბრუნვის წერტილიდან ჩამოკიდებული ტვირთი. ცხადია, ნამდვილი ქანქარა 3-განზომილებიან სივრცეში იარსებებდა, მაგრამ ჩვენ უფრო მარტივ შემთხვევას განვიხილავთ — ქანქარას 2 განზომილებაში — სამუშაო სივრცის პროგრამა
.
ძალების სექციაში ვისწავლეთ, როგორ იწვევს ობიექტის აჩქარებას ძალა (მაგალითად, ზემოთ მოცემულ დიაგრამაში ნაჩვენები გრავიტაცია): F, equals, M, times, A, or A, equals, F, slash, M.
მიუხედავად ამისა, ამ შემთვევაში ქანქარის ტვირთი არ ეცემა მიწაზე, რადგან ის ბრუნვის წერტილზე მიმაგრებულია საკიდით. დავარდნის ნაცვლად ტვირთი ირხევა მისი უძრაობის პოზიციისკენ და ჩვენ გვინდა, გამოვთვალოთ ტვირთის აჩქარება რხევის გაყოლებაზე. მას დავარქვათ კუთხური აჩქარება, რადგან ქანქარა ჩქარდება რკალის გაყოლებაზე.
ქანქარის კუთხური აჩქარების გამოსათვლელად გრავიტაციის ძალა ორ კომპონენტად უნდა დავყოთ. ერთი კომპონენტი იქნება ქანქარის საკიდლის გაყოლებაზე. შეგვიძლია, ეს კომპონენტი უგულებელვყოთ, რადგან საკიდელი ყოველთვის მის საწინააღმდეგო მხარეს ექაჩება და ამით აბათილებს მას. მეორე კომპონენტი მართობულია საკიდლის მიმართ. სწორედ ის გვაინტერესებს, რადგან „გვერდით" ექაჩება ქანქარას და ამით მას არხევს. მოდით, უფრო ახლოდან ვნახოთ ქანქარის დიაგრამა და გრავიტაციის ძალის ეს კომპონენტები ვიზუალურად გამოვსახოთ:
F, start subscript, g, end subscript არის ქვემოთ მიმართული ჯამური ძალა. F, start subscript, p, end subscript არის გრავიტაციის ძალა, რომელიც ქანქარის საკიდის მართობულია და მიმართულია ქანქარის რხევის საპირისპირო მიმართულებით. F, start subscript, a, end subscript არის საკიდის გაყოლებაზე არსებული გრავიტაციის ძალა, რომელსაც უგულებელვყოფთ, რადგან ის არ იმოქმედებს კუთხურ აჩქარებაზე.
როგორ უნდა გამოვთვალოთ F, start subscript, p, end subscript? აქ ვიყენებთ ტრიგონომეტრიას. F, start subscript, g, end subscript არის მართკუთხა სამკუთხედის ჰიპოტენუზა და theta არის საკიდის კუთხე. სინუსი ტოლია მოპირდაპირე შეფარდებული ჰიპოტენუზის:
შესაბამისად:
დიდებულია, ახლა ჩვენ გვაქვს მარტივი ფორმულა F, start subscript, p, end subscript-ს გამოსათვლელად. ახლა დავუბრუნდეთ ჩვენს თავდაპირველ შეკითხვას: რა არის ქანქარის კუთხური აჩქარება? როგორც კი კუთხურ აჩქარებას ვიპოვით, შევძლებთ ჩვენი მოძრაობის წესების გამოყენებას ქანქარის ახალი კუთხის საპოვნელად.
კუთხური სიჩქარე = კუთხური სიჩქარე + კუთხური აჩქარება
კუთხე = კუთხე + კუთხური სიჩქარე
კუთხე = კუთხე + კუთხური სიჩქარე
ნიუტონის მეორე კანონის წყალობით, ვიცით, რომ არსებობს დამოკიდებულება ძალასა და აჩქარებას შორის, კერძოდ F, equals, M, times, A ან A, equals, F, slash, M, და შეგვიძლია, ზემოთ გამოვიყენოთ ეს დამოკიდებულება კუთხური აჩქარების გამოსათვლელად. ნახეთ, შეგიძლიათ თუ არა ამის გაკეთება:
ვიწყებთ შემდეგით:
მართობული ძალა = გრავიტაციის ძალა * sine(θ)
მართობული ძალა = გრავიტაციის ძალა * sine(θ)
შემდეგ მარჯვენა მხარეს ვყოფთ მასაზე, რათა გავიგოთ აჩქარება ნიუტონის მეორე კანონის მიხედვით:
კუთხური აჩქარება = (გრავიტაციის ძალა * sine(θ)) / მასა
კუთხური აჩქარება = (გრავიტაციის ძალა * sine(θ)) / მასა
შემდეგ ვიაზრებთ, რომ შეგვიძლია, გრავიტაციის ძალა გავყოთ მასაზე, და ეს იგივეა, რაც თავისუფალი ვარდნის აჩქარება, ამიტომ მას ჩავსვამთ ფორმულაში:
კუთხური აჩქარება = თავისუფალი ვარდნის აჩქარება * sine (θ)
კუთხური აჩქარება = თავისუფალი ვარდნის აჩქარება * sine (θ)
ტა-დამ! ჩვენ ახლა გვაქვს კუთხური აჩქარების გამოთვლის გზა.
ამის კიდევ უფრო გამარტივება შეგვიძლია, ვინაიდან ProcessingJS-ის პროგრამისტები ვართ და არა — ფიზიკოსები. დიახ, ჩვენ ვიცით, რომ თავისუფალი ვარდნის აჩქარება დედამიწაზე არის 9,8 მეტრი წამში აყვანილი კვადრატში. მაგრამ ეს რიცხვი ჩვენთვის მნიშვნელოვანი არ არის. ჩვენს პროგრამებში „გრავიტაცია“ არის ნებისმიერი რიცხვი, რომელსაც ვიყენებთ ჩვენი აჩქარების ასარჩევად.
კუთხური აჩქარება = გრავიტაცია * sine(θ)
საოცარია. როგორი მარტივია ფორმულა ამ ყველაფრის შემდეგ. შეიძლება, ფიქრობთ, რატომ შევიწუხეთ თავი ამ ყველაფრის გამოყვანით? ანუ, სწავლა კი არის კარგი, მაგრამ ხომ შეგვეძლო, უბრალოდ გვეთქვა, „ჰეი, ქანქარის კუთხური აჩქარება არის რაღაც მუდმივა გამრავლებული კუთხის სინუსზე“.
აქ კიდევ ერთხელ გვახსენდება, რომ ამ კურსის მიზანი არ არის გრავიტაციის ან ქანქარის რხევის სწავლება. ჩვენი მიზანია, დავიწყოთ კრეატიულად ფიქრი კომპიუტერულ გრაფიკულ სისტემებში ობიექტების ეკრანზე მოძრაობის შესახებ. ქანქარა მხოლოდ კერძო მაგალითის განხილვაა. თუ გაიგებთ დაპროგრამების მიდგომას ქანქარის შემთხვევაში, შემდეგ შეგეძლებათ, იგივე ტექნიკები გამოიყენოთ თქვენთვის სასურველი ვირტუალური სამყაროს შესაქმნელად.
რა თქმა უნდა, ჯერ არ დაგვიმთავრებია. შეიძლება, ჩვენი პატარა, ელეგანტური ფორმულა გვახარებს, მაგრამ ის მაინც კოდში უნდა გამოვიყენოთ. ეს ნამდვილად კარგი დროა ჩვენი ობიექტზე ორიენტირებული პროგრამირების უნარების გასავარჯიშებლად და
Pendulum
ობიექტის შესაქმნელად. გავიხსენოთ ყველა თვისება, რომელზეც ვისაუბრეთ ქანქარის განხილვისას, რადგან ამ ყველაფრის გათვალისწინება მოუწევს ობიექტს:- arm length
- კუთხე
- კუთხური სიჩქარე
- კუთხური აჩქარება
გარდა ამისა, უნდა მივუთითოთ, სად ჰკიდია ქანქარა, ასე რომ, შეგვიძლია, კონსტრუქტორით ასე დავიწყოთ:
var Pendulum = function(origin, armLength) {
this.origin = origin;
this.armLength = armLength;
this.angle = PI/4;
this.aVelocity = 0{,}0;
this.aAcceleration = 0{,}0;
};
ჩვენ აგრეთვე მოგვიწევს
update()
მეთოდის დაწერა, რათა განვაახლოთ ქანქარის კუთხე ჩვენი ფორმულის მიხედვით…Pendulum.prototype.update = function() {
// ნებისმიერი მუდმივა
var gravity = 0{,}4;
// გამოვთვალოთ აჩქარება
this.aAcceleration = -1 * gravity * sin(this.angle);
// გავზარდოთ სიჩქარე
this.aVelocity += this.aAcceleration;
// გავზარდოთ კუთხე
this.angle += this.aVelocity;
};
display()
მეთოდი ფანჯარაში ქანქარის დასახატად. ეს იწვევს კითხვას: „ჰმ, სად ვხატავთ ქანქარას?“ ჩვენ ვიცით კუთხე და საკიდის სიგრძე, მაგრამ როგორ გავიგოთ x,y (დეკარტული!) კოორდინატები ქანქარის ბრუნვის წერტილისა (დავარქვათ მას ათვლის სათავე) და ტვირთის ადგილმდებარეობისთვის (დავარქვათ მას პოზიცია)? შეიძლება, ეს ცოტა მოსაბეზრებელი ხდება, მაგრამ პასუხი ამჯერადაც ტრიგონომეტრიაა. მივმართოთ მარცხენა დიაგრამას.ათვლის სათავე ჩვენი მოგონილია, როგორც საკიდლის სიგრძე. ვთქვათ, ჩვენს ქანქარას ასე ვქმნით:
var p = new Pendulum(new PVector(100, 10), 125);
მიმდინარე კუთხეს ვინახავთ
angle
თვისებაში. ამიტომ ათვლის სათავესთან მიმართებაში ქანქარის პოზიცია არის პოლარული კოორდინატი: (r,angle). გვჭირდება, რომ ის დეკარტული იყოს. საბედნიეროდ, კუთხეების სექციაში პოლარული კოორდინატების დეკარტულად გარდაქმნას დრო უკვე დავუთმეთ. იმ სექციაში ჩვენი კუთხე იყო ჰორიზონტალური ღერძის მიმართ, მაგრამ აქ ის ვერტიკალური ღერძის მიმართ არის, ამიტომ ვიყენებთ sin()
-ს x პოზიციისთვის და cos()
-ს y პოზიციისთვის იმის ნაცვლად, რომ cos()
-სა და sin()
-ს ვიყენებდეთ შესაბამისად. აქედან გამომდინარე შეგვიძლია, გამოვთვალოთ პოზიცია ათვლის სათავესთან მიმართებით ამ გადაყვანის ფორმულის გამოყენებით და შემდეგ დავამატოთ მას ათვლის სათავის მდებარეობა:this.position = new PVector(
this.armLength * sin(this.angle),
this.armLength * cos(this.angle));
this.position.add(this.origin);
stroke(0, 0, 0);
fill(175, 175, 175);
line(this.origin.x, this.origin.y, this.position.x, this.position.y);
ellipse(this.position.x, this.position.y, 16, 16);
სანამ ამ ყველაფერს ერთად მოვაქცევთ, არის ერთი მცირე დეტალი, რომელიც არ ვახსენე. დავფიქრდეთ ქანქარის საკიდზე. ის ლითონის ღერძია? სიმია? რეზინის დამჭერია? როგორ არის ის მიმაგრებული ბრუნვის წერტილს? რა სიგრძისაა? რა არის მისი მასა? ქარიანი ამინდია? არსებობს უამრავი შეკითხვა, რომელიც იმოქმედებს ჩვენს სიმულაციაზე. ცხადია, ჩვენ ვცხოვრობთ წარმოსახვით სამყაროში, რომელშიც ქანქარის საკიდი არის იდეალური ღერძი, რომელიც არასდროს იდრიკება, და ტვირთის მასა არის თავმოყრილი ერთ, უსასრულოდ პატარა წერტილში.
მიუხედავად ყველაფრისა, ჩვენ არ გვინდა, ვიდარდოთ ყველა შეკითხვაზე. უნდა დავამატოთ კიდევ ერთი ცვლადი კუთხური აჩქარების ჩვენს გამოთვლებს. ქანქარის აჩქარების გამოთვლისას სიმარტივისთვის დავუშვით, რომ ქანქარის საკიდის სიგრძე არის 1. სინამდვილეში ქანქარის ღერძის სიგრძე აჩქარებაზე დიდ მოქმედებას ახდენს: რაც უფრო გრძელია საკიდი, მით უფრო მცირეა აჩქარება. ქანქარის უფრო ზუსტად სიმულირებისთვის ჩვენ ვყოფთ ამ სიგრძეზე, ამ შემთხვევაში —
armLength
-ზე. უფრო ღრმა ახსნისათვის იხილეთ მარტივი ქანქარის ვებგვერდი.this.aAcceleration = (-1 * gravity / this.armLength) * sin(this.angle);
საბოლოოდ, ნამდვილი ქანქარა განიცდის ხახუნს (ბრუნვის წერტილში) და ჰაერის წინაღობას. ჩვენი ახლანდელი კოდის მიხედვით კი ქანქარა სამუდამოდ გააგრძელებდა რხევას. მეტი რეალობისათვის შეგვიძლია, გამოვიყენოთ „ჩახშობის“ ხრიკი. მე ვამბობ ხრიკს, რადგან წინაღობის ძალების გარკვეული სიზუსტით მოდელირების (რაც ძალების სექციაში გავაკეთეთ) ნაცვლად შეგვიძლია, იმავე შედეგს მივაღწიოთ ყოველი ციკლის დროს კუთხური სიჩქარის შემცირებით. მოცემული კოდი ამცირებს სიჩქარეს 1%-ით (ანუ ამრავლებს მას 99%-ზე) ანიმაციის ყოველ კადრში:
this.aVelocity *= this.damping;
ამ ყოველივეს შემდეგ, გვაქვს ასეთი მაგალითი. ჩვენ ფუნქციონალი დავამატეთ, რათა გაგვეადვილებინა ტვირთის მაუსით გადაზიდვა და სხვადასხვა სიმაღლიდან ჩამოგდებაც. სცადეთ!
ეს „ბუნებრივი სიმულაციების" კურსი ეფუძნება დანიელ შიფმენის წიგნს "კოდის ბუნებას", ის გამოყენებულია ლიცენზიით Creative Commons Attribution-NonCommercial 3,0 Unported License.
გსურთ, შეუერთდეთ დისკუსიას?
პოსტები ჯერ არ არის.