xからyを求める関数

[戻る]
セイ 2005/06/08(水) 11:10:02
CPointの要素がN点ありまして、
その点を使って線(折れ線グラフ)を引いてます。

例えばこんな感じ
CPoint pt[N];

ptにデータセット

dc.Polyline(pt,N);

ここで任意のxに対するyを求める関数とかが
VCにありますでしょうか?
xはN点のptに無いxを指定したいです。

環境ですが、
Vc.net2003を使ってます。

reshia 2005/06/08(水) 11:15:21
私なら、そんな関数を探す前に作ってしまいます。

Polylineって、ただの折れ線なんだから
pt[i].x < x < pt[i+1].x という2つの点がわかれば
そこから x に対する y が求まります。

これぐらいは、すぐですし。

セイ 2005/06/08(水) 11:27:09
レスありがとうございます。
自分数学(算数?)にがてなんです。
紙の上でさえ難儀してますので
プログラムで書くのは難しいです。

とりあえず存在するかどうか教えてください。

tib 2005/06/08(水) 11:47:36
> とりあえず存在するかどうか教えてください。
私の知る限り、ありません。

ところで、これは参考になりますか?
http://www2.edu.ipa.go.jp/gz/e1math/e1ichi/e1ich3/e1hot3.mpg

セイ 2005/06/08(水) 11:59:36
[[解決]]
ありがとうございました。
何とか作ってみます。

reshia [HomePage] 2005/06/08(水) 12:08:52
解決チェックはついていますが、ちょっと待ってください。
たとえば、ぐるぐる巻きのPolylineを描いたとしたら
x に対する y が複数できてしまいます。
どの y を求めたいのかを予め決めておかないと・・

επιστημη 2005/06/08(水) 13:13:46
ひょっとして最小二乗法かなんかで近似直線 y = ax + b の a, b を求めろってことか?

セイ 2005/06/08(水) 13:24:05
reshiaさん

xはx-1<x<x+1前提です。

επιστημηさん

いいえ、単純にy = ax + bで
xに対するyを求めることをしたいだけです。
これを複数の点とxを与えたらyを求めてくれる
関数ないかなと思い質問しました。

セイ 2005/06/08(水) 13:25:43
なんか変だから訂正

>>xはx-1<x<x+1前提です。
xはx[i-1]<x[i]<x[i+1]前提です。

επιστημη 2005/06/08(水) 14:48:23
> 単純にy = ax + bで xに対するyを求めることをしたいだけです。
> これを複数の点とxを与えたらyを求めてくれる関数ないかなと思い質問しました。

C++なら transform てのがありますが。

#include <iostream>
#include <algorithm>

int f(int x) {
  return 2 * x - 3;
}

int main() {
  int x[5] = { -2, -1, 0, 1, 2 };
  int y[5];
  std::transform(x, x+5, y, &f); // x[0]..x[4] を f(x)に与え、結果をy[]に格納
  for ( int i = 0; i < 5; ++i ) {
    std::cout << "f(" << x[i] << ") = " << y[i] << std::endl;
  }
  return 0;
}

/* 実行結果
f(-2) = -7
f(-1) = -5
f(0) = -3
f(1) = -1
f(2) = 1
*/

επιστημη 2005/06/08(水) 14:51:02
> 単純にy = ax + bで xに対するyを求めることをしたいだけです。
> これを複数の点とxを与えたらyを求めてくれる関数ないかなと思い質問しました。

え? 複数の点(x,yの組)から a, b を求めるの? どうやって? 最小二乗法じゃないの?
それとも a, b はわかっているの?

セイ 2005/06/08(水) 15:46:34
自分のやりたいことを書きますと
以下のx,y座標M点(例では5点)で折れ線グラフを書いてます。(xは時間、yは温度)
POINT pt[] = {
 {0,  28}
 {2,  33}
 {4,  111}
 {8,  80}
 {10, 90}
};
条件としてpt[n-1]<pt[n]<[n+1]とします。
x=5のときのyが知りたいので
(4, 111)と(8, 80)の2点間の直線(a,b)を求めて
y = ax + bでyを求めると思いますが、
これを以下のように出来る関数とかないかなあと思いました。
y = func(pt, 5, x)

επιστημη 2005/06/08(水) 16:04:58
> これを以下のように出来る関数とかないかなあと思いました。
> y = func(pt, 5, x)

作りましょう。

えと、

int func(POINT* pt, int N, int x) {
  1. 与えたxを挟むpt[t]とpt[t+1]を探し、
  2. その2点を通る直線の式 y = ax +b の a, b を求め、
  3. それに基づいてyを求める
}

ですか? 

そのまんまやないの。なにがわからんですか?

セイ 2005/06/08(水) 16:52:14
書いてることはわかりますが、
プログラムにするのが難しく。
こういう関数が用意されてないかなあと思って質問しました。
多分、普通の人ははちょちょいのちょいで出来るんでしょうが…
もうちょっと勉強してきます。m(__)m

古いスレッドには追加発言できません。