সঠিকভাবে বড় গাণিতিক প্রক্রিয়া কিভাবে

শুধু একটি প্রশ্ন যে একটি সহজ উত্তর প্রয়োজন। কিভাবে দক্ষতা এবং সঠিকভাবে arduino মধ্যে গাণিতিক পদক্ষেপ একটি বড় সংখ্যা প্রক্রিয়া করবেন?

উদাহরণস্বরূপ আমি এই কোড ফাংশন সেটআপ আছে:

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;

}

এখন আমি এই সমস্ত ভেরিয়েবলের জন্য সঠিকভাবে ডেটা প্রকারগুলি সেটআপ করেছি এবং তারা ফ্লোট, int এবং দীর্ঘ একটি সংমিশ্রণ। আমি এটা তথ্য টাইপ সঙ্গে একটি সমস্যা মনে করি না। আমি যখন সিরিয়ালে চূড়ান্ত উত্তর মুদ্রণ করি তখন একই জিনিসটি ব্যবহারকারী প্রবেশ করে এমন ইনপুট নির্বিশেষে একই রকম হয়।

আমি অনুমান করছি যে কোডটিকে এমনভাবে ফর্ম্যাট করা দরকার যে এটি প্রতিটি ধাপে ধাপে পদক্ষেপ নেয় এবং পরবর্তী গাণিতিক রেখায় এগিয়ে যাওয়ার আগে উত্তরটি যাচাই করে। যদি তাই আমি প্রতিটি গাণিতিক পদক্ষেপের জন্য একটি ফাংশন প্রয়োজন হবে? অথবা আমি অনুপস্থিত যে এই প্রক্রিয়া করার একটি সহজ উপায় আছে।

কোন নির্দেশিকা প্রশংসা করা হয়। ধন্যবাদ।

এখানে সম্পূর্ণরূপে কোড আছে:

unsigned long batterymoment,num1,num2,input,totalmoment;
double buoyancymoment,wheelmoment,cgwheels,mainmass,nosemass,maindistance,nosedistance;
double mainmoment,nosemoment,netmoment,netcg,staticmargin,answer;
double centrebuoyancy = 14.164;
double mainarm = 14.3;
double adc = 11.4;
double meanadc = 22.65;
double nosearm = 1.8;
int totalmass = 12404;
int batterymass = 720;
int buoyancymass = 4401;
int batteryposition,wheelweight;
boolean mySwitch = false;

void calc() {
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;  
 }

void setup() {
  Serial.begin(9600);
  num1=0;
  num2=0;
  Serial.println("Enter battery position");
 }

void loop() {
  while (Serial.available()){
    batteryposition = Serial.read();
    if(batteryposition>47 && batteryposition<58){  
      if(!mySwitch){
         num1=(num1*10)+(batteryposition-48);
      }else{
         num2=(num2*10)+(batteryposition-48);
        }
       }

if(batteryposition==61){
  input=num1+num2;
  calc();
  Serial.print("Static margin is: ");
  Serial.println(answer);
  num1=0;
  num1=0;
  mySwitch=false;
  }
 }
}

সুতরাং ব্যবহারকারী ইনপুট উপর নির্ভর করে, গণনা চূড়ান্ত আউটপুট উত্তর পরিবর্তন হবে। উদাহরণস্বরূপ, যদি 5 টি প্রবেশ করানো উচিত তাহলে আউটপুট-তে আমার গণনার উপর ভিত্তি করে আউটপুট -4.22 হওয়া উচিত।

0
ঘোষণা, প্রকৃত ফলাফল, এবং প্রত্যাশিত ফলাফল প্রদর্শন করুন। এবং কিছু অতিরিক্ত Serial.print রাখুন ("উত্তর:"); Serial.println (উত্তর); ডিবাগিং কোডটি আপনাকে সমস্যাটি আলাদা করতে সহায়তা করে।
যোগ লেখক Dave X, উৎস
এবং এটা কি মুদ্রণ করে? আমি একটি "ইনপুট = 5;" রাখতাম ক্যালক() এর আগে কোডটিতে, এবং তারপরে আপনি অপ্রত্যাশিত কিছু না হওয়া পর্যন্ত calc() এ ডিবাগ ডিবাগ মুদ্রণ চেষ্টা করুন।
যোগ লেখক Dave X, উৎস
আবার, আপনি নমুনাটি দুইবার স্পষ্ট করতে চান নাকি আপনি প্রক্রিয়াকরণের পরে num2 পরিষ্কার করতে চান।
যোগ লেখক Dave X, উৎস
আমি কি দরকারী খুঁজে পেয়েছি, একটি স্প্রেডশীট বা ছোট কনসোল অ্যাপ্লিকেশনে জটিল অ্যালগরিদমগুলি পরীক্ষা করছে (এমনকি জটিল নয় এমনও)। একবার আমি তাদের কাজ পেতে, আমি Arduino কোড রূপান্তর, যা বেশ সহজবোধ্য। এটি বাগ-মুক্ত কোডের কোনও ওয়্যারেন্টি নয় তবে এটি বেশ কাছাকাছি।
যোগ লেখক Nayt Grochowski, উৎস
এটি প্রিন্ট -113.70 ইনপুট @ ডেভক্স নির্বিশেষে
যোগ লেখক TestOChangeO, উৎস

2 উত্তর

আপনি প্রত্যেক সময় একই মান পাচ্ছেন কারণ এটি যে মান গণনা করা হচ্ছে।

আমি মনে করি আপনি আপনার সূত্র বাস্তবায়ন কিভাবে কিছু ভুল আছে। আপনি যদি "answer =" থেকে শুরু করেন এবং বার বার ভ্যারিয়েবলগুলি সূত্র বা মানগুলির সাথে প্রতিস্থাপন করেন যা এই ভেরিয়েবলগুলিকে আপনার সাথে শেষ করে দেয়:

উত্তর = (11.4 - (((4401 * 14.164) + (((((12404 - 4401) * (1 - ((14.3 - (12404 - 4401))/((14.3 - (12404 - 4401)) + (12404 - 4401 - 1.8))))/2) * 14.3) + (((((12404 - 4401) * (1 - ((12404 - 4401 - 1.8)/((12404 - 4401 - 1.8) + (14.3 - (12404 - 4401))))))/2) * 1.8))/12404))/22.65

যে সম্পর্কে পরিবর্তনশীল কিছুই নেই।

আপনার ইনপুট মান batterymoment গণনা করার জন্য ব্যবহার করা হচ্ছে। batterymoment আমাদের totalmoment গণনা করার জন্য ব্যবহার করা হচ্ছে। totalmoment কে হুইলমোমেন্ট গণনা করার জন্য ব্যবহার করা হচ্ছে। হুইলমোমেন্ট কে cgwheels গণনা করার জন্য ব্যবহার করা হচ্ছে। cgwheels কিছু জন্য ব্যবহার করা হয় না।

3
যোগ

আপনার মন্তব্য অনুযায়ী, calc() ফাংশন প্রত্যাশিত হিসাবে অভিনয় করা হয় না।

ক্যালক() পরিবর্তন করুন:

void calc() {
  Serial.print("input:");Serial.println(input);
  batterymoment = input*batterymass;
  totalmoment = 149650+batterymoment;
  buoyancymoment = buoyancymass*centrebuoyancy;
  wheelmoment = totalmoment - buoyancymoment;
  wheelweight = totalmass - buoyancymass;
  cgwheels = wheelmoment/wheelweight;
  maindistance = mainarm - wheelweight;
  nosedistance = wheelweight - nosearm;
  mainmass = (((wheelweight)*(1-((maindistance)/(maindistance+nosedistance))))/2);
  nosemass = (((wheelweight)*(1-((nosedistance)/(nosedistance+maindistance))))/2);
  mainmoment = mainmass*mainarm;
  nosemoment = nosemass*nosearm;
  netmoment = buoyancymoment+mainmoment+nosemoment;
  netcg = netmoment/totalmass;
  staticmargin = adc - netcg;
  answer = staticmargin/meanadc;
  Serial.print("answer:");Serial.println(answer);  
 }

এবং প্রত্যাশিত ইনপুট পায় এবং প্রত্যাশিত হিসাবে কাজ করে দেখুন। তারপরে আপনি প্রসেসে ডিবাগিং বিবৃতিগুলি যোগ করবেন না যতক্ষণ না আপনি মেলে না।

আমি আরো একটি ফাংশন, বা আরও ভাল সংজ্ঞায়িত ফাংশন সিরিজের মধ্যে চালু, এবং তারপর পৃথকভাবে তাদের পরীক্ষা হবে।

আপনার কোড হিসাবে গ্লোবাল ভেরিয়েবল, সিরিয়াল পার্সিং, এবং গণনা মধ্যে মিথস্ক্রিয়া আছে। আপনি এটি আলাদা টুকরা মধ্যে বিরতি, সমস্যা যেখানে আপনি আলাদা করতে পারেন।

0
যোগ