Google शीट्स में एक सीमा में डेटा को कैसे प्रक्षेपित किया जाए


9

मेरे पास डेटा के साथ एक सरणी है:

   X      Y
   3     50
   5     60
   9    120
  11    130
  18     90
  20    150

डेटा पूरी तरह से गैर-रैखिक है। X को हल करने की गारंटी है।

अब किसी भी दिए गए मूल्य के लिए, मैं संख्याओं के बीच रैखिक प्रक्षेप करना चाहूँगा (उदाहरण के लिए, 3 => 50, 4 => 55, 5 => 60)। एक बिलिनियर प्रक्षेप भी अच्छा होगा, लेकिन मैं अपनी उम्मीदों को कम रख रहा हूं।

जवाबों:


9

यह स्क्रिप्ट वही करेगी (प्लस थोड़ा और)।

कोड

function myInterpolation(x, y, value) {
  if(value > Math.max.apply(Math, x) || value < Math.min.apply(Math, x)) {
    throw "value can't be interpolated !!";
    return;
  }

  var check = 0, index;
  for(var i = 0, iLen = x.length; i < iLen; i++) {
    if(x[i][0] == value) {
      return y[i][0];
    } else {      
      if(x[i][0] < value && ((x[i][0] - check) < (value - check))) {
        check = x[i][0];
        index = i;
      }
    }
  }

  var xValue, yValue, xDiff, yDiff, xInt;
  yValue = y[index][0];
  xDiff = x[index+1][0] - check;
  yDiff = y[index+1][0] - yValue;
  xInt = value - check; 

  return (xInt * (yDiff / xDiff)) + yValue;
}

व्याख्या की

स्क्रिप्ट की शुरुआत में, एक छोटी सी त्रुटि से निपटने है। उसके बाद यह इनपुट मूल्य की तुलना में पहली सबसे कम प्रविष्टि पाएगा। एक बार मिल जाने पर, यह कुछ गणित करेगा और परिणाम प्रस्तुत करेगा।

ध्यान दें

यदि चयनित मान 20 के बराबर है, तो स्क्रिप्ट 150 देता है जहाँ सूत्र देता है #DIV/0

स्क्रीनशॉट

यहाँ छवि विवरण दर्ज करें

सूत्र

सभी मानों को ध्यान में रखने के लिए निम्न सूत्र का उपयोग करें

=IF(
   ISNA(
     MATCH(C2,A2:A7,0)),
   FORECAST(
     $C$2,
     OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),
     OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)), 
   INDEX(
     B2:B7,
     MATCH(C2,A2:A7,0)
     ,0)
 )

 copy / paste
 =IF(ISNA(MATCH(C2, A2:A7, 0)), FORECAST($C$2,OFFSET(B$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1),OFFSET(A$2,MATCH($C$2,A$2:A$7,1)-1,0,2,1)), INDEX(B2:B7, MATCH(C2, A2:A7, 0), 0))

उदाहरण

उपकरण> स्क्रिप्ट संपादक के तहत स्क्रिप्ट जोड़ें और सहेजें बटन दबाएं (कोई प्रमाणीकरण आवश्यक नहीं)।

मैंने आपके लिए एक उदाहरण फ़ाइल बनाई है: Google शीट में किसी श्रेणी में डेटा को कैसे प्रक्षेपित किया जाए


2
धन्यवाद जैकब! सच कहूँ तो, मैं अपने संस्करण को लगभग बेहतर पसंद करता हूं क्योंकि यह मोबाइल उपकरणों पर भी काम करता है (देशी एंड्रॉइड शीट ऐप और वेब ऐप के मोबाइल संस्करण में स्क्रिप्ट समर्थन नहीं है), लेकिन आपका कार्य निश्चित रूप से क्लीनर और अधिक सुरुचिपूर्ण है । तो मैं आपका जवाब चुन रहा हूं।
EboMike

@EboMike मैंने अपने कोड को देखा और एक त्रुटि देखी। मैंने कोड को संशोधित किया और एक सूत्र के साथ आया, ताकि आप इसे अपने मोबाइल ऐप पर उपयोग कर सकें।
जैकब जान टुंस्ट्रा

2
और यही कारण है कि यह दुर्भाग्यपूर्ण है कि आप एक से अधिक बार उत्तर नहीं दे सकते :) धन्यवाद जैकब।
EboMike

10

मुझे ऐसा करने का एक तरीका मिला - एक बेहतर तरीका हो सकता है, लेकिन यह वही है जो मैं लेकर आया हूं:

मान लिया गया है कि डेटा A1 में है: B10 और $ C $ 1 में देखने की कुंजी है:

=FORECAST($C$1,
    OFFSET(B$1,MATCH($C$1,A$1:A$10,1)-1,0,2,1),
    OFFSET(A$1,MATCH($C$1,A$1:A$10,1)-1,0,2,1))

विस्तार से:

FORECAST एक रैखिक प्रक्षेप करता है, लेकिन यह एक सीधी रेखा को मानता है। इसलिए हमें उन दो मूल्यों को खोजने की आवश्यकता है जो उस मान को संलग्न करते हैं जिसकी हम तलाश कर रहे हैं।

इसलिए हम MATCH का उपयोग उस पहले नंबर को खोजने के लिए करते हैं जो समान या उससे अधिक है जिसे हम खोज रहे हैं।

FORECAST एक डेटा श्रेणी की अपेक्षा करता है, इसलिए हम OFFSET का उपयोग डेटा रेंज का संदर्भ बनाने के लिए करते हैं। MATCH एक-अनुक्रमित है, इसलिए हमें पहले एक को घटाना होगा। हम एक सीमा बनाते हैं जो एक चौड़ी और दो ऊँची होती है। यह मान हमारे खोज मूल्य $ C $ 1 को संलग्न करने की गारंटी है।


+1; अच्छा सूत्र !! चुनने x=20में परिणाम होगा #DIV/0
जैकब जान टुंस्ट्रा

1

यह जेकब जान टुंस्ट्रा की पटकथा का एक छोटा संशोधन है , जो इसे तीसरे तर्क के रूप में एक सरणी या मान लेने में सक्षम बनाता है, ताकि एक ही बार में कई स्थानों पर प्रक्षेपित फ़ंक्शन की गणना की जा सके। एकमात्र अंतर शुरुआत में जोड़ी गई कुछ पंक्तियाँ हैं; यह एक कस्टम फंक्शन में किसी भी कस्टम फंक्शन को चालू करने का एक त्वरित तरीका है जो एक ऐरे को स्वीकार करता है।

function myInterpolation(x, y, value) {
  if (value.map) {
    return value.map(function(v) {
      return myInterpolation(x, y, v);
    });
  }
  //  the rest stays the same

  if (value > Math.max.apply(Math, x) || value < Math.min.apply(Math, x)) {
    throw "value can't be interpolated !!";
    return;
  }

  var check = 0, index;
  for(var i = 0, iLen = x.length; i < iLen; i++) {
    if(x[i][0] == value) {
      return y[i][0];
    } else {      
      if(x[i][0] < value && ((x[i][0] - check) < (value - check))) {
        check = x[i][0];
        index = i;
      }
    }
  }

  var xValue, yValue, xDiff, yDiff, xInt;
  yValue = y[index][0];
  xDiff = x[index+1][0] - check;
  yDiff = y[index+1][0] - yValue;
  xInt = value - check; 

  return (xInt * (yDiff / xDiff)) + yValue;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.