আনুমানিক আরকসিন


9

লক্ষ্যটি সহজ: অল্প সংখ্যক বাইটে ইনপুট দেওয়া xসমীকরণের একটি ননজারো আসল সমাধান আউটপুট sin(x) = -mxকরুন m।

বিশেষ উল্লেখ:

  • আপনার উত্তরটি অবশ্যই 3 টি গুরুত্বপূর্ণ ব্যক্তির কাছে সঠিক হতে হবে।
  • আপনি তুচ্ছ সমাধান ছাড়া অন্য কোনও আসল সমাধান আউটপুট করতে পারেন x=0। আপনি ধরে নিতে পারেন mএটি এমন যে কমপক্ষে একটি সমাধান বিদ্যমান। আপনিও ধরে নিতে পারেন m!=0।

গ্রেডিয়েন্ট বংশদ্ভুত ব্যবহার করে একটি সুস্পষ্টভাবে সাবঅপটিমাল অজগর সমাধান :

from math import *
from random import *
a=x=0.001
m = 5.
def dE(x):return 2*(sin(x)+m*x+1)*(cos(x)+m)
for i in xrange(1000): x-=dE(x)*a
print x

পরীক্ষার মামলা

-0.25 -> ±2.4746
-0.1  -> ±2.8523 or ±7.0682 or ±8.4232
 0.2  -> ±4.1046 or ±4.9063 

1
এখানে সর্বোত্তম পদ্ধতির একটি নির্দিষ্ট মান মুদ্রণ করা হয়, যদিও আপনাকে কত দশমিক স্থানের প্রয়োজন তা নির্দিষ্ট করা উচিত। আমি একটি ইনপুট প্যারামিটার সহ করার সুপারিশ করছি, aসমাধানের জন্য sin(x)=-ax। অনুগ্রহ করে "আপনাকে অবশ্যই এটি গণনা করতে হবে" বলবেন না, কারণ এর মতো প্রয়োজনীয়তাগুলি কাজ করা খুব অস্পষ্ট।
— xnor

এছাড়াও, x=0একটি তুচ্ছ সমাধান। আপনি কোন সমাধান চান তা নির্দিষ্ট করা উচিত।
— xnor

ননজারো সমাধানের গ্যারান্টি দিতে আপনার কিছুটা সীমার দরকার আছে।
— xnor

m=0সমাধান আছে ( x=kπপূর্ণসংখ্যার জন্য k)। যার মানগুলিতে mঅ-তুচ্ছ সত্যিকারের সমাধান নেই সেগুলি হ'ল এটি অনেক দূরের 0।
— পিটার টেলর

1
আপনি কি কেবল আসল-মূল্যবান সমাধানের সন্ধান করছেন বা জটিল-মূল্যবান সমাধানগুলিও অনুমোদিত?
— মাইল

উত্তর:


1

ised : 32 28 বাইট

নিউটনের পুনরাবৃত্তিটি π থেকে শুরু করে:

{:x-{sinx+$1*x}/{cosx+$1}:}:::pi

যুক্তিটি পাস করা হয়েছে $1, যা কোনও ফাইল থেকে নেওয়া যেতে পারে:

ised --l inputfile.txt 'code'

কিছুটা কম স্থিতিশীল তবে সংক্ষিপ্ত সংস্করণ:

{:{x-tanx}/{1+$1/cosx}:}:::pi

কখনও কখনও এটি পুনরাবৃত্তি সীমা সতর্কতা নিক্ষেপ করে তবে শর্তগুলি বিবেচনা করে যথার্থতা ঠিক মনে হয়।

ইউনিকোড সংস্করণ (একই বাইকাউন্ট):

{λ{x-tanx}/{1+$1/cosx}}∙π

4 থেকে শুরু করে আরেকটি বাইট কাটা এবং একই মানগুলিতে রূপান্তরিত হয় বলে মনে হয়

{λ{x-tanx}/{1+$1/cosx}}∙4

8

হাস্কেল, 34 বাইট

f m=until(\x->sin x< -m*x)(+1e-3)0

x0 থেকে 0.001 অবধি গণনা করা হয় sin(x)< -m*x।

Ouput উদাহরণ

f -0.2 ->   2.595999999999825
f -0.1 ->   2.852999999999797
f  0.0 ->   3.141999999999765
f  0.1 ->   3.4999999999997256
f  0.2 ->   4.1049999999997056

কি হবে m=-0.1?
— পিটার টেলর

@ পিটারটেলর নোট করুন এটির প্রয়োজন কিনা তা নিশ্চিত করুন তবে এটি দেয় 2.853যা সঠিক দেখাচ্ছে।
— xnor

অবশ্যই, তারা উভয়ই স্বতন্ত্র ফাংশন তাই কোনও সমাধান থাকলে যদি ইতিবাচক সমাধান হয়। ডোহ।
— পিটার টেলর

আপনি কেন এমন চ্যালেঞ্জটির উত্তর দেবেন যেটি আপনি জানেন না তা অস্পষ্ট?
— মেগো

2

গণিত, 28 বাইট

x/.FindRoot[Sinc@x+#,{x,1}]&

প্রাথমিক অনুমান থেকে সংখ্যার মূল অনুসন্ধান করে x=1। পরীক্ষার কেস:

% /@ {-0.25, -0.1, 0.2}
(* {2.47458, 2.85234, 4.10462} *)

1

সি, 99 বাইট

#include<math.h>
float f(float m){float x=1,y;do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);return x;}

ungolfed:

#include<math.h>
float f(float m){
 float x=1,y;
 do{x=(y=sin(x)+m*x)+x;}while(fabs(y)>1e-4);
 return x;
}

1

এমএটিএল , 17 বাইট

`@2e3/tY,wG_*>}4M

এটি ইতিবাচক বাস্তব অক্ষরে রৈখিক অনুসন্ধান ব্যবহার করে, তাই এটি ধীর হয়। সমস্ত পরীক্ষার কেসগুলি অনলাইন সংকলকটিতে 1 মিনিটের মধ্যে শেষ হয়।

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

`         % Do...while
  @       %   Push iteration index, starting at 1
  2e3/    %   Divide by 2000
  t       %   Duplicate
  Y,      %   Sine
  w       %   Swap
  G_*     %   Multiply by minus the input
  >       %   Does the sine exceed that? If so, next iteration
}         % Finally (execute after last iteration, before exiting loop)
   4M     %   Push input of sine function again
          % Implicit end
          % Implicit display

1

সি ++ 11, 92 91 বাইট

ব্যবহারের জন্য -1 বাইট #import

#import<cmath>
using F=float;F f(F m,F x=1){F y=sin(x)+m*x;return fabs(y)>1e-4?f(m,x+y):x;}

0

পাইথন 2, 81 78 বাইট

ফিক্সপয়েন্ট পুনরাবৃত্তি

পুনরাবৃত্ত লাম্বদা হিসাবে

from math import*
f=lambda m,x=1:abs(sin(x)+m*x)>1e-4and f(m,sin(x)+m*x+x)or x

লুপ হিসাবে (81 বাইট):

from math import*
m=input()
x=1
while abs(sin(x)+m*x)>1e-4:x=sin(x)+m*x+x
print x

0

গণিত, 52 বাইট

NSolve[Sin@x==-x#,x,Reals][[;;,1,2]]~DeleteCases~0.&

বেনামে ফাংশন। ইনপুট হিসাবে একটি সংখ্যা নেয় এবং আউটপুট হিসাবে সংখ্যার একটি তালিকা প্রদান করে। NSolveআনুমানিক সমীকরণ সমাধান করতে কেবল ব্যবহার করে।


আপনি প্রতিস্থাপন Sin@x==-x#সঙ্গে Sinc@x==-#তোমাদেরকে বিলুপ্তিতে নিয়ে যাবেন করতে~DeleteCases~0.

0

অ্যাক্সিয়োম, 364 বাইট

bisezione(f,a,b)==(fa:=f(a);fb:=f(b);a>b or fa*fb>0=>"fail";e:=1/(10**(digits()-3));x1:=a;v:=x2:=b;i:=1;y:=f(v);if(abs(y)>e)then repeat(t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1;if i>999 or t<=e or abs(y)<e then break;if fb*y<0 then(x1:=v;fa:=y)else if fa*y<0 then(x2:=v;fb:=y)else break);i>999 or abs(y)>e=>"fail";v)
macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ungolf

bisezione(f,a,b)==
    fa:=f(a);fb:=f(b)
    a>b or fa*fb>0=>"fail"
    e:=1/(10**(digits()-3))
    x1:=a;v:=x2:=b;i:=1;y:=f(v)
    if(abs(y)>e) then
      repeat
        t:=(x2-x1)/2.0;v:=x1+t;y:=f(v);i:=i+1
        if i>999 or t<=e or abs(y)<e then break
        if      fb*y<0 then(x1:=v;fa:=y)
        else if fa*y<0 then(x2:=v;fb:=y)
        else break
    i>999 or abs(y)>e=>"fail"
    v

macro g(m) == bisezione(x+->(sin(x)+m*x), 0.1, 4.3)

ফলাফল

(3) -> g(0.2)
   AXIOM will attempt to step through and interpret the code.
   (3)  4.1046198505 579058527
                                                              Type: Float
(4) -> g(-0.1)
   (4)  2.8523418944 500916556
                                                              Type: Float
(5) -> g(-0.25)
   (5)  2.4745767873 698290098
                                                              Type: Float

0

হাস্কেল, 50 বাইট

আমি আমার ক্যালক ক্লাসে নিউটনের পদ্ধতি সম্পর্কে শিখেছি, সুতরাং এখানে haskellনিউটনের পদ্ধতিটি ব্যবহার করা যায় ।

f m=foldl(\x _->x-(sin x+m*x)/(cos x+m))0[1..10]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.